首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#:当某些事件发生时,如何暂停线程并继续?

C#:当某些事件发生时,如何暂停线程并继续?
EN

Stack Overflow用户
提问于 2011-01-31 14:01:49
回答 3查看 20.2K关注 0票数 20

当某些事件发生时,如何暂停线程并继续?

我希望当一个按钮被点击时线程继续。有人告诉我,thread.suspend不是暂停线程的合适方式。有没有其他的解决方案?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-31 14:22:33

你可以使用System.Threading.EventWaitHandle

EventWaitHandle会一直阻塞,直到收到信号为止。在本例中,它将由按钮单击事件发出信号。

代码语言:javascript
运行
复制
private void MyThread()
{
    // do some stuff

    myWaitHandle.WaitOne(); // this will block until your button is clicked

    // continue thread
}

你可以像这样给你的等待句柄发信号:

代码语言:javascript
运行
复制
private void Button_Click(object sender, EventArgs e)
{
     myWaitHandle.Set(); // this signals the wait handle and your other thread will continue
}
票数 22
EN

Stack Overflow用户

发布于 2011-01-31 14:12:23

实际上,挂起线程是一种不好的做法,因为您很少确切地知道线程当时在做什么。让线程经过一个ManualResetEvent,每次调用WaitOne()会更容易预测。这将充当一个门-控制线程可以调用Reset()关闭门(暂停线程,但安全),并调用Set()打开门(恢复线程)。

例如,您可以在每次循环迭代开始时调用WaitOne (如果循环太紧,则每隔一次n迭代调用一次)。

票数 8
EN

Stack Overflow用户

发布于 2013-07-27 02:14:49

你也可以试试这个

代码语言:javascript
运行
复制
private static AutoResetEvent _wait = new AutoResetEvent(false);

public Form1()
    {
        InitializeComponent();
    }

private void Form1_Load(object sender, EventArgs e)
    {
        Control.CheckForIllegalCrossThreadCalls = false;
        backgroundWorker1.RunWorkerAsync();
    }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Dosomething();
    }

private void Dosomething()
{
 //Your Loop
 for(int i =0;i<10;i++)
   {
    //Dosomething
    _wait._wait.WaitOne();//Pause the loop until the button was clicked.

   } 
}

private void btn1_Click(object sender, EventArgs e)
    {
        _wait.Set();
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4848064

复制
相关文章

相似问题

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