调用.Result或等待已知的已完成任务之间有区别吗?

时间:2015-04-22 21:34:44

标签: c# async-await task

以下代码块中是否存在任何功能,性能或死锁风险?

示例1:

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

示例2:

await Task.WhenAll(task1, task2); 
var result1 = task1.Result;
var result2 = task2.Result; 

1 个答案:

答案 0 :(得分:7)

  

以下代码块中是否存在任何功能,性能或死锁风险?

不,没有这样的情况。

在这两种情况下,都会创建一个任务,该任务将在完成task1task2时完成。

因此,当你写:

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

代码将同步执行。您不必await获取某些内容,因为task1task2都已完成。

对于第二个例子,同样适用于尝试获得结果的地方。

var result1 = task1.Result;
var result2 = task2.Result; 

由于任务已经完成,你不会阻止任何线程调用线程或任何上下文切换等。

<强>更新

这两种方法之间存在的唯一功能差异是错误处理不同。 await仅展开AggregateException,而.Result只会引发异常。