如何恢复/中断后台工作线程
本文关键字:中断 后台 工作 线程 何恢复 恢复 | 更新日期: 2023-09-27 18:03:10
在我的程序中,有时我必须调用
Thread.Sleep(Timeout.Infinite);
"暂时暂停"BackgroundWorker。在后台工作线程休眠之前,会显示一个组框。这个组框有一个按钮,它应该"唤醒"后台工作线程并继续它。
如果我调用Thread. interrupt()(顺便说一下,我似乎不能使用,除非我创建一个线程对象,我不应该这样做)在button_Click事件,如:
private void button1_Click(object sender, EventArgs e)
{
Thread.Interrupt(); //interrupt thread
}
它"将"中断的线程是UI线程,我对吗?我需要做的是中断BackgroundWorker线程。我该怎么做呢?
编辑:感谢那些回答这个问题的人。我将使用AutoResetEvent。似乎更适合我使用让我从高级概念开始:
你应该做的是在BackgroundWorker执行的代码中每隔一段时间检查一个令牌。当令牌设置时,您的后台代码将停止正常流程,只需不时检查令牌,当令牌被清除时,后台代码可以继续处理。
所以上面有趣的部分是令牌。我要做的是检查一个布尔值,当布尔值设置为true
时,我将通过等待ManualResetEvent
来阻塞线程。当你想恢复处理你设置布尔值为假,并使用Set()
方法的ManualResetEvent释放允许代码继续。
你必须查看ManualResetEvent
用法:
ManualResetEvent e = new ManualResetEvent(false); //global variable
e.WaitOne(); // Thread will wait until event is triggered
e.Set(); // Trigger event from other thread
你应该使用信号量在线程之间进行同步。
一旦你想让后台工作线程"睡眠",抓住信号量的句柄,一旦你点击"唤醒"按钮,释放信号量,后台工作线程将继续。
从你的GUI线程(显示按钮的那个)你应该声明
Semaphore s = new Semaphore(0, 1);
在后台工作线程中——该语句初始化一个信号量,默认值为0(锁定)
在你的后台工作线程/代码调用:
s.WaitOne();
这个语句实际上导致后台工作线程等待,直到信号量被GUI线程(你的唤醒按钮)释放。
上的按钮点击处理程序,调用:
s.Release();
释放操作允许后台worker代码继续运行。