C# 完成后合并两个后台工作人员的结果

C# 完成后合并两个后台工作人员的结果,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,我有两个背景线程 Worker = new BackgroundWorker(); Worker.DoWork += new DoWorkEventHandler(GetQuery); Worker.RunWorkerCompleted += GetQuery_RunWorkerCompleted; Worker.RunWorkerAsync(); Worker2012 = new BackgroundWorker(); Worker2012.DoWork += new DoWorkEvent

我有两个背景线程

Worker = new BackgroundWorker();
Worker.DoWork += new DoWorkEventHandler(GetQuery);
Worker.RunWorkerCompleted += GetQuery_RunWorkerCompleted;
Worker.RunWorkerAsync();

Worker2012 = new BackgroundWorker();
Worker2012.DoWork += new DoWorkEventHandler(GetQuery2012);
Worker2012.RunWorkerCompleted += GetQuery2012_RunWorkerCompleted;
Worker2012.RunWorkerAsync();
工作线程中的两个方法都返回数据表

现在我的任务是将这两个数据表合并为一个

由于这个原因,我在完成第一个任务时就这样做了

void GetQuerys_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
   do{} while(Worker2012.IsBusy);
   //Merge Datatables
}

但由于某些原因,do-while循环似乎处于无限循环中。线没有结束。有人能告诉我我做错了什么吗。或者是否有更好的方法等待第二个工作线程完成,以便合并数据。任何帮助都将不胜感激

我建议改用TPL,使其更具可读性:

Task query1 = GetQuery();
Task query2 = GetQuery2012();

Task.WhenAll(query1, query2).ContinueWith( t => {

  //merge

});
如果希望主线程(异步)等待合并表,也可以执行
wait Task.WhenAll()…

确保将
Query
方法更改为以下内容:

public Task GetQuery() {
  return Task.Run( () => {
    //do background work
  });    
}
编辑 我只是注意到这可能会出问题

ContinueWith任务(很可能)不会在UI线程中运行

如果需要在UI线程中合并表,则应改为:

public void UIMethod() {
    Task query1 = GetQuery();
    Task query2 = GetQuery2012();

    await Task.WhenAll(query1, query2); //will free the thread until both tasks complete
    MergeTables();
}

这样,
MergeTables()
方法将在UI线程上运行。

既然.NET 4.5已经推出,我建议每个人都使用
任务。运行
而不是
BackgroundWorker
,如下所示:

var task1 = Task.Run(() => GetQuery());
var task2 = Task.Run(() => GetQuery2012());
var dataTables = await Task.WhenAll(task1, task2);
// Merge databases

Task.Run
在各个方面都优于
BackgroundWorker
,这在做任何复杂的事情(即协调两个后台操作)时尤其明显。

我确实尝试过。睡了2秒钟,但还是不起作用。为什么不呢?如果您执行
wait Task.WhenAll()…
,您的UI线程将可以自由执行其他内容,并且当两个任务完成时,您的方法将重新获得控制权。如果您不等待
,您的UI线程将继续运行。TPL是专门为此而设计的。getquery方法的结果?等待任务的结果。当所有的
无效时,您不能将其分配给数据表awesome这只需要很少的代码行就可以很好地工作。谢谢stephen@dcastro:
等待任务。如果所有参数都是
任务(使用相同的
TResult
),whalll
将返回一个结果数组(
TResult[]
)。很抱歉,我在msdn文档中看到了错误的重载!getquery的示例?