Thread.Suspend()方法的替代方法
问题描述:
Thread.Suspend()
方法已过时,如您所知。当按钮点击事件发生时,我想立即中止线程。我使用了Thread.Suspend(),它的工作原理非常完美,但是每个人都建议使用Thread.Suspend()方法不是一个很好的方法来暂停任务。我使用了一个标志来暂停任务,但每次按下按钮点击事件时,我都必须等待退出任务。我使用Thread.IsAlive标志等待线程退出,但此方法冻结窗体。Thread.Suspend()方法的替代方法
void ButtonClickEvent(object sender, ButtonClickEventArgs e)
{
TheadExitFlag = false;
if(MyThread != null)
{
while(MyThread.IsAlive);
//MyThread.Suspend();
}
}
void MyTask(void)
{
while(TheadExitFlag)
{
// some process
Thread.Sleep(5000);
}
}
我该如何暂停该线程吗?
答
AFAIK有相同的功能没有替代。我不确定操作系统的问题是否可以在语言/库中得到解决,但没有尝试过这样做,所以也许这太难了,或者甚至是理智的不可能。
直到存在这样一个变量时,您可以减少轮询挂起标志,然后等待某个同步对象获得“恢复”信号。我为此已使用AutoResetEvent。
答
使用ManualResetEvent
在运行状态和空闲状态之间切换。
ManualResetEvent run = new ManualResetEvent(true);
void ResumeButton_Click(object sender, ButtonClickEventArgs e)
{
run.Set();
PauseButton.Enabled = true;
ResumeButton.Enabled = false;
}
void PauseButton_Click(object sender, ButtonClickEventArgs e)
{
run.Reset();
PauseButton.Enabled = false;
ResumeButton.Enabled = true;
}
void MyTask(void)
{
while (run.WaitOne()) // Wait for the run signal.
{
// Do work here.
}
}
请更清楚你想做什么 - 如果你想'暂停'线程或退出线程,我甚至不会100%确定。另一个例子:MyThread是对MyTask运行的线程的引用吗?看起来像'ThreadExitFlag == true'意味着线程应该*不*退出;如果是这样,我建议你改名。 – 2012-04-18 09:51:07
你为什么要暂停线程? – user844541 2012-04-18 09:51:32
我敢打赌,你试图解决一个问题,使用错误的设施,为什么你需要暂停一个线程? – sll 2012-04-18 11:01:23