gpt4 book ai didi

c# - BackgroundWorker 的 IsBusy 是否与 "IsAlive"相同?

转载 作者:太空狗 更新时间:2023-10-29 19:51:34 24 4
gpt4 key购买 nike

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

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

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

我可以指望IsBusy吗?做:

if (!myWorker.IsBusy)
RestartWorker();

还是我在找麻烦?

最佳答案

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

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

关于c# - BackgroundWorker 的 IsBusy 是否与 "IsAlive"相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13139691/

24 4 0