在示例代码中是否需要Task.WhenAll?

时间:2013-09-11 17:05:29

标签: c# task-parallel-library async-await

在下面的代码中,task1和task2相互独立,可以并行运行。以下两个实现有什么区别?

var task1 = GetList1Async();
var task2 = GetList2Async();

await Task.WhenAll(task1, task2);

var result1 = await task1; 
var result2 = await task2; 

var task1 = GetList1Async();
var task2 = GetList2Async();

var result1 = await task1; 
var result2 = await task2; 

为什么我要选择一个而不是另一个?

编辑:我想补充一点,GetList1Async()和GetList2Async()方法的返回类型是不同的。

2 个答案:

答案 0 :(得分:10)

您的第一个示例将等待两个任务完成,然后检索两者的结果。

您的第二个示例将等待任务一次完成一个。

您应该使用更清楚的代码。如果两个任务具有相同的结果类型,则可以从WhenAll检索结果:

var results = await Task.WhenAll(task1, task2);

答案 1 :(得分:1)

第一个结构更具可读性。 在获得结果之前,您明确表示您打算等待所有任务完成。我发现使用它代替第二种方式是合理的。

如果添加第3或第4个任务,写作也会少一些...... 即:

await Task.WhenAll(task1, task2, task3, task4);

与之相比:

var result1 = await task1; 
var result2 = await task2; 
var result3 = await task3; 
var result4 = await task4;