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

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

到目前为止,我找到的最接近IsAlive()的是IsBusy属性,但是考虑到我的线程sleep()大部分时间都是这样,我不确定这是否能完成任务。
我能指望IsBusy做什么吗?
if (!myWorker.IsBusy)
  RestartWorker();

还是我在自找麻烦?

最佳答案

BackgroundWorker.IsBusy是正确的,只要DoWork事件处理程序正忙且RunWorkerCompleted事件处理程序尚未运行。请注意后一个子句,该属性不会告诉您循环是否处于活动状态。
此外,在第二个片段中有一个相当恶劣的种族状况。isbusy在if()语句中可能为true,但在一纳秒后为false。一个月一次的比赛。代码的意图很难从片段中理解,因此很难给出解决方法。考虑一下总是创建一个新的bgw对象,它永远不会竞争。同样有助于消除这个循环,一个休眠10秒的线程在无所事事上浪费了非常昂贵的系统资源。这会影响线程池调度程序。

09-05 11:07