首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thread.Suspend()方法的替代方法

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

Stack Overflow用户
提问于 2012-04-18 17:34:36
回答 3查看 3.9K关注 0票数 3

如你所知,Thread.Suspend()方法已经过时了。当按钮点击事件到来时,我想立即挂起线程。我使用了Thread.Suspend(),它工作得很好,但是每个人都认为使用Thread.Suspend()方法不是挂起任务的好方法。我使用了一个标志来暂停任务,但每次当按钮单击事件发生时,我必须等待退出任务。我使用了Thread.IsAlive标志来等待线程退出,但是这个方法冻结了表单。

代码语言:javascript
复制
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);
    }
}

如何立即挂起线程?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-18 17:53:17

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-04-18 23:12:37

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

代码语言:javascript
复制
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.
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-08-21 15:59:40

https://stackoverflow.com/a/45786529/3013473中有一个使用AspectJ和wait/notify的近似解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10206664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档