BackgroundWorkers永远不会停止忙碌

Mar*_*elo 9 .net c# multithreading backgroundworker visual-studio

for (do it a bunch of times)
{         
    while (backgroundWorker1.IsBusy && backgroundWorker2.IsBusy &&
           backgroundWorker3.IsBusy && backgroundWorker4.IsBusy &&
           backgroundWorker5.IsBusy)
    {
        System.Threading.Thread.Sleep(0001);
    }

    if (!backgroundWorker1.IsBusy)
    {
        backgroundWorker1.RunWorkerAsync();
    }
    else if (!backgroundWorker2.IsBusy)
    {
        backgroundWorker2.RunWorkerAsync();
    }
    else if (!backgroundWorker3.IsBusy)
    {
        backgroundWorker3.RunWorkerAsync();
    }
    else if (!backgroundWorker4.IsBusy)
    {
        backgroundWorker4.RunWorkerAsync();
    }
    else if (!backgroundWorker5.IsBusy)
    {
        backgroundWorker5.RunWorkerAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

它运行五次(每个BG工作一次)并且一直卡住.背景工作者不要再忙吗?我如何查看空房情况?

注意:有5个工作线程,这可以确保它们都不会停止,总是为它们分配工作.但他们拒绝告诉我什么时候可用,我认为这将有一个简单的解决方案..

- [编辑请求] ---

实际上它只是一个虚拟参数,我删除它并忘了把它拿出来,我只用它来调用dowork,谁做了脏工作:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    timeconsumingfunction(publicstring);
}
Run Code Online (Sandbox Code Playgroud)

时间消耗功能结束了.在调试器中逐步进入它并在每行运行一行,直到结束并到达最后的'}'.这意味着它结束了吧?

--- [编辑答案] ----它通过JUST替换线路

System.Threading.Thread.Sleep(0001);
Run Code Online (Sandbox Code Playgroud)

Application.DoEvents();
Run Code Online (Sandbox Code Playgroud)

我想它会运行后台,但没有收到答案,也没有更新IsBusy标签.

谢谢大家,很棒的答案,帮了很多忙!

Han*_*ant 34

您的循环导致死锁,BGW无法完成.问题是RunWorkerCompleted事件,它是在UI线程上引发的.那一点BGW魔法要求UI线程处于空闲状态,它必须抽取其消息循环.问题是,UI线程不是空闲的,它不是在发送消息,而是停留在for循环中.因此,事件处理程序无法运行且IsBusy保持为true.

你需要以不同的方式做到这一点.利用RunWorkerCompleted事件运行此for循环后通常运行的代码.抵制在循环中调用Application.DoEvents()的所有诱惑.

  • 不,在RunWorkerCompleted事件完成运行之前,它不会完成.在DoWork事件处理程序完成后会发生这种情况.RWC处理程序是问题,它无法运行,因为您的UI线程陷入循环.删除处理程序将是一个快速解决方案. (3认同)
  • 因为当用户在循环运行时关闭表单时,程序将崩溃并刻录.通过在进入循环之前将表单的Enable属性设置为false来解决此问题. (2认同)