参见英文答案 >
Await on a completed task same as task.Result?2个
以下代码块中是否存在任何功能,性能或死锁差异风险?
以下代码块中是否存在任何功能,性能或死锁差异风险?
例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;
解决方法
Is there any functional,performance,or risk of deadlock difference in the below code blocks?
不,没有这样的情况.
在这两种情况下,都会创建一个任务,该任务将在task1和task2完成时完成.
因此,当你写:
var result1 = await task1; var result2 = await task2;
代码将同步执行.您不必等待某事,因为您同时完成了task1和task2.
对于第二个示例,同样适用于您尝试获取结果的位置.
var result1 = task1.Result; var result2 = task2.Result;
由于任务已经完成,因此不会阻塞任何线程调用线程或进行任何上下文切换等.
更新
这两种方法之间存在的唯一功能差异是错误处理不同.等待只是解开一个AggregateException,而.Result只会引发异常.