如何等待后台工作者完成处理?

Ryd*_*der 4 c# parallel-processing backgroundworker winforms

我有3个后台工作人员,每个工作人员处理一个24位位图图像(Y,Cb,Cr)的通道.每个8位图像的处理需要几秒钟,并且它们可能无法同时完成.

我想在完成后将频道合并为一个图像.单击一个按钮时,每个按钮都会backgroundWorkerN.RunWorkerAsync()启动,当它们完成时,我会设置一个标志为true.我尝试使用while循环while (!y && !cb && !cr) { }来连续检查标志,直到它们为真,然后退出循环并继续处理下面的代码,这是将通道合并回来的代码.但是当我运行它时,过程永远不会结束.

   private void button1_Click(object sender, EventArgs e)
   {
        backgroundWorker1.RunWorkerAsync();
        backgroundWorker2.RunWorkerAsync();
        backgroundWorker3.RunWorkerAsync();

        while (!y && !cb && !cr) { }

        //Merge Code
   }
Run Code Online (Sandbox Code Playgroud)

小智 5

基于Renuiz的答案,我会这样做:

private object lockObj;

private void backgroundWorkerN_RunWorkerCompleted(
    object sender, 
    RunWorkerCompletedEventArgs e)
{
    lock (lockObj)
    {
        y = true;
        if (cb && cr) // if cb and cr flags are true - 
                      // other backgroundWorkers finished work
        {
            someMethodToDoOtherStuff();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)