如何恢复/中断后台工作线程

本文关键字:中断 后台 工作 线程 何恢复 恢复 | 更新日期: 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代码继续运行。