编程语言
首页 > 编程语言> > c#-等待这些BackgroundWorker中的任何一个完成

c#-等待这些BackgroundWorker中的任何一个完成

作者:互联网

FORM(有一些UI)应使用服务下载序列.
当前,此下载位于BackgroundWorker线程中.
现在,由于性能很慢…我们决定将FORMS分为2类,并开始使用现有Thread之上的另一个BackgroundWorker并行下载.

现在,该场景是BackgroundWorker中的任何一个都应该等待其他人完成.
因此,如何实现它.

我尝试使用AutoResetEvent.但是,我无法做到这一点.

任何帮助表示赞赏.

解决方法:

我不认为实际情况是一个BackgroundWorker应该等待另一个.您真正想要的是在两个事件都完成后(且仅在这两个事件完成之后)触发一些UI事件.这是一个微妙但重要的区别.第二个版本更容易编码.

public class Form1 : Form
{
    private object download1Result;
    private object download2Result;

    private void BeginDownload()
    {
        // Next two lines are only necessary if this is called multiple times
        download1Result = null;
        download2Result = null;

        bwDownload1.RunWorkerAsync();
        bwDownload2.RunWorkerAsync();
    }

    private void bwDownload1_RunWorkerCompleted(object sender,
        RunWorkerCompletedEventArgs e)
    {
        download1Result = e.Result;
        if (download2Result != null)
            DisplayResults();
    }

    private void bwDownload2_RunWorkerCompleted(object sender,
        RunWorkerCompletedEventArgs e)
    {
        download2Result = e.Result;
        if (download1Result != null)
            DisplayResults();
    }

    private void DisplayResults()
    {
        // Do something with download1Result and download2Result
    }
}

请注意,那些对象引用应该是强类型的,我只是使用对象,因为我不知道您要下载什么.

这确实是您所需要的; RunWorkerCompleted事件在前台线程中运行,因此您实际上不必担心那里的同步或竞争条件.不需要锁语句,AutoResetEvent等.只需使用两个成员变量来保存结果,或者使用两个布尔标志(如果其中一个的结果实际上可以为null).

标签:multithreading,backgroundworker,c,net
来源: https://codeday.me/bug/20191106/2001502.html