在我的计划中,有一段时间我必须致电
Thread.Sleep(Timeout.Infinite);
“暂时暂停”BackgroundWorker。在backgroundworker线程休眠之前将显示一个组框。该groupbox有一个按钮,应该“唤醒”后台工作线程并继续它。
如果我在button_Click事件中调用Thread.Interrupt()(除非我创建一个我不应该做的Thread对象,我似乎无法使用它),例如:
private void button1_Click(object sender, EventArgs e)
{
Thread.Interrupt(); //interrupt thread
}
它“会”中断的线程是UI线程,对吗?我需要做的是中断BackgroundWorker线程。我该怎么做?
编辑:感谢那些回答这个问题的人。我将使用AutoResetEvent。似乎更适合我的使用。答案 0 :(得分:3)
让我从高级概念开始:
您应该做的是拥有一个令牌,您可以在BackgroundWorker正在执行的代码中经常检查。设置令牌后,您的后台代码将停止正常流程,并且只是偶尔检查令牌,当令牌被清除时,后台代码可以继续处理。
所以上面有趣的部分是令牌。我要做的可能是我检查一个布尔值,当布尔值设置为true
时,我会通过等待ManualResetEvent
来阻止线程。如果要恢复处理,请将布尔值设置为false,并使用ManualResetEvent的Set()
方法释放,允许代码继续。
答案 1 :(得分:2)
您必须查看ManualResetEvent
用法:
ManualResetEvent e = new ManualResetEvent(false); //global variable
e.WaitOne(); // Thread will wait until event is triggered
e.Set(); // Trigger event from other thread
答案 2 :(得分:0)
您应该使用信号量在线程之间进行同步。
一旦你想要后台工作人员“睡觉”,抓住信号量的句柄,一旦你点击“唤醒”按钮,释放信号量,后台工作人员将恢复...
从你的GUI线程(显示按钮的那个)你应该声明
Semaphore s = new Semaphore(0, 1);
后台工作线程上的- 此语句初始化一个默认值为0(已锁定)的信号量
在你的backgroundworker线程/代码调用上:
s.WaitOne();
这个语句实际上导致后台工作者等到gui线程释放信号量(你的唤醒按钮)。
在按钮单击处理程序上,调用:
s.Release();
发布操作允许后台工作程序代码恢复运行。