suspend和resume应该用什么代替?

JACoder 2016-01-31 07:57:28
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using static System.Diagnostics.Process;

namespace newjob
{
public partial class Form1 : Form
{
Thread myThread;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
myThread = new Thread(new ThreadStart(threadCreate));
myThread.Start();
}
public void threadCreate()
{
while (true)
{
int a = GetProcessesByName("QQ").Length;
if (a > 0)
{
this.Text = "程序已在运行";
}
else
{
this.Text = "程序未运行";
}
Thread.Sleep(1000);
}
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
myThread.Abort();
}

private void button1_Click(object sender, EventArgs e)
{
myThread.Suspend();
}

private void button2_Click(object sender, EventArgs e)
{
myThread.Resume();
}
}
}

以上代码中,提示Thread.Suspend();和Thread.Resume();的用法都已经过时。应该用什么语句来替代呢?
...全文
449 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
john_QQ:2335298917 2016-01-31
  • 打赏
  • 举报
回复
为什么不鼓励使用 Thread.suspend 和 Thread.resume? Thread.suspend 从本质上就是易于死锁的。如果目标线程锁定在一个监视程序上,从而在关键系统资源挂起时保护资源,则在目标线程恢复前将没有线程能访问该资源。如果试图恢复目标线程的线程在调用 resume 之前试图锁定该监视程序,即出现死锁。这种死锁通常将自己显示为“冻结”进程。 应该使用什么来代替 Thread.suspend 和 Thread.resume? 与 Thread.stop 一样,最谨慎的方法是让“目标”线程轮询一个指示所需线程状态(活动或挂起)的变量。当需要挂起状态时,线程将使用 Object.wait 进行等待。当线程恢复时,将使用 Object.notify 通知目标线程。 例如,假定 applet 包含下列 mousePressed 事件处理程序,它将触发名为 blinker 的线程的状态: private boolean threadSuspended; Public void mousePressed(MouseEvent e) { e.consume(); if (threadSuspended) blinker.resume(); else blinker.suspend(); // 易于死锁! threadSuspended = !threadSuspended; } 用下列代码替代上述事件处理程序,即可避免使用 Thread.suspend 和 Thread.resume: public synchronized void mousePressed(MouseEvent e) { e.consume(); threadSuspended = !threadSuspended; if (!threadSuspended) notify(); } 然后将下列代码添加到“run loop”中: synchronized(this) { while (threadSuspended) wait(); } wait public void run() { while (true) { try { Thread.currentThread().sleep(interval); synchronized(this) { while (threadSuspended) wait(); } } catch (InterruptedException e){ } repaint(); } } 注意:mousePressed 方法中的 notify 和 run 方法中的 wait 位于 synchronized 块内部。这是语言所要求的,可确保 wait 和 notify 的序列化。从实际应用来说,这消除了导致“挂起”线程丢失 notify 并无限期地保持挂起状态的竞争情况。 尽管 Java 中同步的费用随着平台的成熟不断下降,但它永远不会是免费的。用户可以使用一种简易技巧来删除添加在每一次“run loop”中的同步。前面添加的同步块被一段稍复杂的代码所替代(这段代码只有在实际挂起时才进入同步块): if (threadSuspended) { synchronized(this) { while (threadSuspended) wait(); } } 最终的 run 方法为: public void run() { while (true) { try { Thread.currentThread().sleep(interval); if (threadSuspended) { synchronized(this) { while (threadSuspended) wait(); } } } catch (InterruptedException e){ } repaint(); } } 在没有提供显式同步前,threadSuspended 必须为 volatile,以确保挂起请求的快速通讯。
devmiao 2016-01-31
  • 打赏
  • 举报
回复
线程wait信号量,或者自己退出
  • 打赏
  • 举报
回复
没有什么可替代的,根本不就应该这样设计。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧