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

本文关键字:方法 Suspend Thread | 更新日期: 2023-09-27 18:31:25

您所知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);
    }
}

如何立即挂起线程?

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

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

在存在这样的本机之前,您将沦为轮询挂起标志,然后等待某个同步对象以获取"恢复"信号。我已经为此使用了自动重置事件。

使用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.
    }
}

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