7

我正在尝试找出一种方法来验证 BackgroundWorker 线程是否处于活动状态(即仍在运行。该线程本质上是作为一个简单的无限循环实现的:

while (AllConditionsMet())
{
  DoSomeMagic();
  Thread.Sleep(10000);
}

IsAlive()到目前为止,我发现的最接近的是IsBusy属性,但考虑到我的线程大部分时间是 Sleep(),我不确定这是否能完成这项工作。

我可以指望IsBusy做:

if (!myWorker.IsBusy)
  RestartWorker();

还是我在找麻烦?

4

4 回答 4

14

BackgroundWorker.IsBusy只要 DoWork 事件处理程序正忙RunWorkerCompleted 事件处理程序尚未运行,则为真。请注意后一个子句,该属性不会告诉您循环是否处于活动状态。

此外,您的第二个片段中有一个相当讨厌的竞争条件。IsBusy 在语句中可能为真,if()但在一纳秒后为假。那种每月举行一次的比赛。代码的意图很难从代码片段中理解,因此很难给出解决方法。考虑总是创建一个永远不会竞争的新 BGW 对象。还有助于摆脱该循环,一个线程休眠 10 秒正在浪费非常昂贵的系统资源而无所事事。它搞砸了线程池调度程序。

于 2012-10-30T13:49:16.533 回答
8

为确保 Backgroundworker 真正停止,您可以手动将其杀死。设置yourBackgroundWorker.WorkerSupportsCancellation = true;。然后简单地停止Backgroundworker:

yourBackgroundWorker.CancelAsync();

仍然isBusy应该足以检测您的BackgroundWorker.

于 2012-10-30T13:26:08.093 回答
4

文档

true,如果 BackgroundWorker 正在运行异步操作;否则,false

不管你是否让工作线程休眠,它仍然在做一些事情,所以使用IsBusy应该没问题。

于 2012-10-30T13:11:39.963 回答
0

创建一个布尔变量,每当backgroundworker开始运行时将变量设置为true,在backgroundworker完成后将布尔变量设置为false。检查布尔变量状态,它可以显示后台工作程序是否仍在运行或不准确。

于 2020-02-12T03:36:15.460 回答