Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何等待两个后台工作人员';s RunWorkerCompleted事件是否已完成?_C# - Fatal编程技术网

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();
}