如你所知,Thread.Suspend()方法已经过时了。当按钮点击事件到来时,我想立即挂起线程。我使用了Thread.Suspend(),它工作得很好,但是每个人都认为使用Thread.Suspend()方法不是挂起任务的好方法。我使用了一个标志来暂停任务,但每次当按钮单击事件发生时,我必须等待退出任务。我使用了Thread.IsAlive标志来等待线程退出,但是这个方法冻结了表单。
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);
}
}如何立即挂起线程?
发布于 2012-04-18 17:53:17
没有具有相同功能的替代方案,AFAIK。我不确定OS Suspend()的问题是否可以在语言/库中解决,但还没有人尝试这样做,所以可能太难了,甚至是不可能的。
在存在这样的警报本机之前,您只能轮询挂起标志,然后等待某个同步对象的“恢复”信号。为此,我使用了AutoResetEvent。
发布于 2012-04-18 23:12:37
使用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.
}
}发布于 2017-08-21 15:59:40
在https://stackoverflow.com/a/45786529/3013473中有一个使用AspectJ和wait/notify的近似解决方案。
https://stackoverflow.com/questions/10206664
复制相似问题