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);
}
}
我如何暂时暂停线程?
答案 0 :(得分:4)
没有其他具有相同功能的选择,AFAIK。我不确定操作系统Suspend()
的问题是否可以在语言/库中解决,但是没有尝试这样做,所以可能太困难甚至不可能。
在存在这样的alernative之前,您将减少轮询暂停标志,然后在某个同步对象上等待“恢复”信号。我已经使用了AutoResetEvent。
答案 1 :(得分:4)
使用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.
}
}
答案 2 :(得分:0)
使用AspectJ和wait / notify在https://stackoverflow.com/a/45786529/3013473有一个近似的解决方案。