0

那是代码:

   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 的完成事件中,我编写如下代码:

    private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
    {
           doSomethingelsebk1();
    }

    private void backgroundWorker2_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
    {
           doSomethingelsebk2();
    }

现在的问题是:button1 的点击事件中的函数 doSomething() 必须等待两个 backgrandworker 的完成事件完成。如果我将 doSomething() 更改为

    private void backgroundWorker2_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
    {
           doSomethingelsebk2();
           doSomething();  
    }

然后,因为有两个线程,我不知道哪个线程会先完成,所以有什么解决办法

4

2 回答 2

0

创建 2 个标志,代表 2 的完整状态BackgroundWorker

RunWorkerCompleted事件中打开每个标志,然后调用doSomething()方法。

doSomething方法中,检查两个标志是否都打开,然后继续执行,否则返回。

于 2013-03-28T09:29:57.287 回答
0

创建 2 个 AutoResetEvents,在每个后台工作人员完成时设置它们,并在 main 方法中使用WaitHandle等待它们。

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();
}
于 2013-03-28T13:54:29.630 回答