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()的所有诱惑.