This question already has answers here:
Await on a completed task same as task.Result?

(2 个回答)


6年前关闭。




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

示例 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;

最佳答案



不,不存在这样的情况。

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

因此,当你写:

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

代码将同步执行。您不必为某事使用 await,因为 task1task2 都已完成。

对于第二个示例,您尝试获得其结果也是如此。
var result1 = task1.Result;
var result2 = task2.Result;

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

更新

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

关于c# - 调用.Result或等待已知的完成任务有什么区别吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29809302/

10-17 02:49