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

では、スレッドが 2 つあるため、どちらのスレッドが先に終了するかわかりません。

4

2 に答える 2

0

2 つの AutoResetEvents を作成し、各バックグラウンド ワーカーが終了したときにそれらを設定し、メイン メソッドで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 に答える
0

2 の完全な状態を表す 2 つのフラグを作成しますBackgroundWorker

イベントで各フラグをオンにしてから、メソッドRunWorkerCompletedを呼び出しますdoSomething()

メソッドではdoSomething、両方のフラグがオンになっているかどうかを確認してから続行し、そうでない場合は戻ります。

于 2013-03-28T09:29:57.287 に答える