我试图找出一种方法来验证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秒的线程在无所事事上浪费了非常昂贵的系统资源。这会影响线程池调度程序。