首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BackgroundWorkers从不停止忙碌

BackgroundWorkers从不停止忙碌
EN

Stack Overflow用户
提问于 2010-02-02 19:14:11
回答 8查看 18.8K关注 0票数 9
代码语言:javascript
运行
复制
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();
    }
}

它运行了五次(每个BG-worker运行一次),并且在这段时间被卡住了。后台工作人员从来没有停止过忙碌吗?如何查看可用性?

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

--编辑请求

实际上它只是一个伪参数,我把它移走了,忘了把它取出来,我只是用它来调用dowork,谁来做这些脏活:

代码语言:javascript
运行
复制
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    timeconsumingfunction(publicstring);
}

那么时间消耗函数就结束了。在调试器中进入它并逐行运行,它一直运行到最后,到达最后的'}‘。这意味着一切都结束了,对吧?

-编辑答案-只需替换行即可工作

代码语言:javascript
运行
复制
System.Threading.Thread.Sleep(0001);

使用

代码语言:javascript
运行
复制
Application.DoEvents();

我猜它会运行后台,但不会收到答案,也不会更新IsBusy标签。

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-02-02 20:15:37

您的循环导致死锁,BGWs无法完成。问题出在RunWorkerCompleted事件,它是在UI线程上引发的。BGW的魔力要求UI线程处于空闲状态,它一定是在执行消息循环。问题是,UI线程不是空闲的,也不是发送消息,而是卡在for循环中。因此,事件处理程序无法运行,IsBusy保持为真。

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

票数 34
EN

Stack Overflow用户

发布于 2010-02-02 19:36:15

我建议您更改代码以处理RunWorkerCompleted事件,以便在BackgroundWorker完成其工作时收到通知。下面是一个如何在the official documentation中使用BackgroundWorker的示例。

票数 3
EN

Stack Overflow用户

发布于 2010-02-02 19:38:26

我在使用后台工作者时遇到了同样的问题,并得出结论,如果在循环中使用sleep(),那么它将被卡住。您可以使用RunWorkerCompleted事件并设置一个布尔标志来指示每个worker何时完成。

或者,如果你想中止线程,你可以考虑使用线程,而不是后台工作者。但是,在后台工作程序提供的事件方面,您将失去易用性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2183520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档