如何恢复/中断BackgroundWorker线程

时间:2011-07-24 10:48:01

标签: c# .net multithreading backgroundworker

在我的计划中,有一段时间我必须致电

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。似乎更适合我的使用。

3 个答案:

答案 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();

发布操作允许后台工作程序代码恢复运行。