c# – 在已知的已完成任务上调用.Result或等待是否有区别?

前端之家收集整理的这篇文章主要介绍了c# – 在已知的已完成任务上调用.Result或等待是否有区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > 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只会引发异常.

猜你在找的C#相关文章