我试图找出一种方法来验证BackgroundWorker线程是否处于活动状态(即仍在运行。该线程基本上是作为一个简单的无限循环实现的:
while (AllConditionsMet())
{
DoSomeMagic();
Thread.Sleep(10000);
}
到目前为止我发现的IsAlive()
最接近的是IsBusy属性,但考虑到我的线程Sleep()大部分时间,我不确定这是否能完成这项工作。
我可以依靠IsBusy来做:
if (!myWorker.IsBusy)
RestartWorker();
或者我是在呼救?
答案 0 :(得分:13)
BackgroundWorker.IsBusy
为真。请注意后一条款,该属性不告诉您循环是否有效。
此外,在你的第二个片段中有一个相当讨厌的竞争条件。 IsBusy在if()
语句中可能是真的,但在纳秒之后是假的。这种比赛每月一次。代码的意图很难从片段中汲取,因此很难给出解决方法。考虑始终创建一个永远不会竞争的新BGW对象。还有助于摆脱这个循环,一个休眠10秒的线程在无所事事时浪费了非常昂贵的系统资源。它会使线程池调度程序变得粗糙。
答案 1 :(得分:7)
要确保Backgroundworker真正停止,您可以手动终止它。
设置yourBackgroundWorker.WorkerSupportsCancellation = true;
。
然后只需使用以下命令停止Backgroundworker:
yourBackgroundWorker.CancelAsync();
仍然isBusy
应足以检测BackgroundWorker
的正在运行/正在运行的实例。
答案 2 :(得分:4)
答案 3 :(得分:0)
创建一个布尔变量,每当后台工作程序开始运行时将其设置为true,在后台工作程序完成后将布尔变量设置为false。检查布尔变量状态,它可以显示您是后台工作程序仍在运行还是不正确。