Thread.Suspend()方法的替代方案

时间:2012-04-18 09:34:36

标签: c# multithreading suspend

如你所知,

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);
    }
}

我如何暂时暂停线程?

3 个答案:

答案 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有一个近似的解决方案。