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,谁来做这些脏活:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
timeconsumingfunction(publicstring);
}那么时间消耗函数就结束了。在调试器中进入它并逐行运行,它一直运行到最后,到达最后的'}‘。这意味着一切都结束了,对吧?
-编辑答案-只需替换行即可工作
System.Threading.Thread.Sleep(0001);使用
Application.DoEvents();我猜它会运行后台,但不会收到答案,也不会更新IsBusy标签。
谢谢大家,很棒的答案,帮了大忙!
发布于 2010-02-02 20:15:37
您的循环导致死锁,BGWs无法完成。问题出在RunWorkerCompleted事件,它是在UI线程上引发的。BGW的魔力要求UI线程处于空闲状态,它一定是在执行消息循环。问题是,UI线程不是空闲的,也不是发送消息,而是卡在for循环中。因此,事件处理程序无法运行,IsBusy保持为真。
你需要用不同的方式来做这件事。利用RunWorkerCompleted事件来运行通常在此for循环之后运行的代码。抵制所有在循环内调用Application.DoEvents()的诱惑。
https://stackoverflow.com/questions/2183520
复制相似问题