C# 如何等待两个后台工作人员';s RunWorkerCompleted事件是否已完成?
这就是代码:C# 如何等待两个后台工作人员';s RunWorkerCompleted事件是否已完成?,c#,C#,这就是代码: private void button1_Click(object sender, EventArgs e) { ParaClass pcs = new ParaClass(); pcs.strPath = textBox1.Text; pcs.sendedGrid = ugSrc; this.backgroundWorker1.RunWorkerAsync(pcs); ParaClass
private void button1_Click(object sender, EventArgs e)
{
ParaClass pcs = new ParaClass();
pcs.strPath = textBox1.Text;
pcs.sendedGrid = ugSrc;
this.backgroundWorker1.RunWorkerAsync(pcs);
ParaClass pcsB = new ParaClass();
pcsB.strPath = textBox2.Text;
pcsB.sendedGrid = ultraGrid2;
this.backgroundWorker2.RunWorkerAsync(pcsB);
doSomething();
}
在backgrandworker1和backgrandworker2的Complete事件中,我编写的代码如下:
private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
doSomethingelsebk1();
}
private void backgroundWorker2_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
doSomethingelsebk2();
}
现在的问题是:button1的click事件中的函数doSomething()必须等待BackWorker的完整事件完成。
如果我把doSomething()改为
然后,因为有两个线程,我不知道哪个线程将首先完成,所以解决方案是什么创建两个标志,它们表示2
BackgroundWorker
的完整状态
在RunWorkerCompleted
事件中打开每个标志,然后调用doSomething()
方法
在
doSomething
方法中,检查两个标志是否都已启用,然后继续执行,否则返回。创建2个自动重置事件,在每个后台工作程序完成时设置它们,并在主方法中使用
为什么不让backgroundworker2成为一个普通的方法而不是异步的呢?或者你可以使用AsyncCallBack委托。这里是一个使用异步回调的好例子。谢谢你的回复,正如你所说,我收到了一个错误消息:不支持STA线程上多个句柄的WaitAll。嗨,你可以看看:
private void backgroundWorker2_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
doSomethingelsebk2();
doSomething();
}
WaitHandle[] handles = new WaitHandle[] { new AutoResetEvent(false), new AutoResetEvent(false)};
private void button1_Click(object sender, EventArgs e)
{
ParaClass pcs = new ParaClass();
pcs.strPath = textBox1.Text;
pcs.sendedGrid = ugSrc;
this.backgroundWorker1.RunWorkerAsync(pcs);
ParaClass pcsB = new ParaClass();
pcsB.strPath = textBox2.Text;
pcsB.sendedGrid = ultraGrid2;
this.backgroundWorker2.RunWorkerAsync(pcsB);
WaitHandle.WaitAll(this.handles);
doSomething();
}
private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
doSomethingelsebk1();
((AutoResetEvent)this.handles[0]).Set();
}
private void backgroundWorker2_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
doSomethingelsebk2();
((AutoResetEvent)this.handles[1]).Set();
}