This question already has answers here:
Await on a completed task same as task.Result?
(2 个回答)
6年前关闭。
以下代码块中是否存在任何功能、性能或死锁风险差异?
示例 1:
示例 2:
代码将同步执行。您不必为某事使用
对于第二个示例,您尝试获得其结果也是如此。
由于任务已经完成,因此您不会阻止任何线程调用线程或进行任何上下文切换等。
更新
这两种方法之间存在的唯一功能差异是错误处理不同。
(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;
最佳答案
不,不存在这样的情况。
在这两种情况下,都会创建一个任务,该任务将在 task1
和 task2
完成时完成。
因此,当你写:
var result1 = await task1;
var result2 = await task2;
代码将同步执行。您不必为某事使用
await
,因为 task1
和 task2
都已完成。对于第二个示例,您尝试获得其结果也是如此。
var result1 = task1.Result;
var result2 = task2.Result;
由于任务已经完成,因此您不会阻止任何线程调用线程或进行任何上下文切换等。
更新
这两种方法之间存在的唯一功能差异是错误处理不同。
await
只是解开 AggregateException
,而 .Result
只会引发异常。关于c# - 调用.Result或等待已知的完成任务有什么区别吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29809302/
10-17 02:49