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