0

我有两个异步任务(A 和 B),完成后将调用传递的回调方法。我想等到两者都完成并能够使用任务 A 和 B 的结果执行另一个任务 C。

如何实现?有这样做的标准方法吗?

任何指针都会有所帮助。

4

3 回答 3

2

使用Task.WaitAll等待任务 A 和 B 完成。

例子:

 var A = new Task<string>(DoA);
 var B = new Task<string>(DoB);

 A.Start();
 B.Start();

 Task.WaitAll(A, B);

 var C = new Task(() =>
                         {
                             string resultA = A.Result;
                             string resultB = B.Result;

                             //Do something more;
                         }
                    );
 C.Start();
于 2012-08-08T08:44:27.403 回答
1

有几种方法可以解决这个问题,例如通过线程,但在 C# 中,您可以使用其他方法来实现此问题。因此,您必须使用委托和异步方法调用。

这是来自 Microsoft 支持的链接 - 如果您是一位经验丰富的 C# 程序员,您可以向下滚动并阅读示例,否则我建议您阅读全文。

http://support.microsoft.com/kb/315582 (示例 3 可以解决您的问题)。

于 2012-08-08T08:42:16.937 回答
1

使用Task.WhenAllTask.ContinueWith

var taskA = new Task<string>(DoA);
var taskB = new Task<string>(DoB);
var taskC = new Task<string>( () => DoC(taskA.Result, taskB.Result));
var taskCheckPoint = Task.WhenAll(taskA, taskB);
var taskFollowUp = taskCheckPoint.ContinueWith(taskC);
taskA.Start();
taskB.Start();
//now we return, instead of waiting.

如果您没有 .net 4.5,那么您必须使用某种形式的等待。您可能不希望 Task 创建方法等待,因此让 taskC 等待:

var taskA = new Task<string>(DoA);
var taskB = new Task<string>(DoB);
var taskC = new Task<string>( () =>{
  taskA.Wait();
  taskB.Wait();
  DoC(taskA.Result, taskB.Result)
});
taskA.Start();
taskB.Start();
taskC.Start();
//now we return, instead of waiting.
于 2012-08-17T17:56:02.137 回答