BackgroundWorker的IsBusy与“IsAlive”相同吗?

时间:2012-10-30 13:07:30

标签: c# winforms .net-4.0 backgroundworker watchdog

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

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

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

我可以依靠IsBusy来做:

if (!myWorker.IsBusy)
  RestartWorker();

或者我是在呼救?

4 个答案:

答案 0 :(得分:13)

只要DoWork事件处理程序忙尚未运行RunWorkerCompleted事件处理程序,

BackgroundWorker.IsBusy为真。请注意后一条款,该属性告诉您循环是否有效。

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

答案 1 :(得分:7)

要确保Backgroundworker真正停止,您可以手动终止它。 设置yourBackgroundWorker.WorkerSupportsCancellation = true;。 然后只需使用以下命令停止Backgroundworker:

yourBackgroundWorker.CancelAsync();

仍然isBusy应足以检测BackgroundWorker的正在运行/正在运行的实例。

答案 2 :(得分:4)

来自docs

  

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

无论你是否睡过工作线程,它仍然某事,所以使用IsBusy应该没问题。

答案 3 :(得分:0)

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