3

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

我怎样才能立即暂停线程?

4

3 回答 3

4

AFAIK 没有具有相同功能的替代方案。我不确定操作系统的问题Suspend()是否可以在语言/库中解决,但没有尝试这样做,所以它可能太难了,甚至是不可能的。

在存在这样的替代方案之前,您只能轮询挂起标志,然后在某个同步对象上等待“恢复”信号。我为此使用了AutoResetEvent

于 2012-04-18T09:53:16.603 回答
4

使用 aManualResetEvent在运行和空闲状态之间切换。

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.
    }
}
于 2012-04-18T15:12:37.203 回答
0

在https://stackoverflow.com/a/45786529/3013473有一个使用 AspectJ 和等待/通知的近似解决方案。

于 2017-08-21T07:59:40.023 回答