以下代码块中是否存在任何功能,性能或死锁风险?
示例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;
答案 0 :(得分:7)
以下代码块中是否存在任何功能,性能或死锁风险?
不,没有这样的情况。
在这两种情况下,都会创建一个任务,该任务将在完成task1
和task2
时完成。
因此,当你写:
var result1 = await task1;
var result2 = await task2;
代码将同步执行。您不必await
获取某些内容,因为task1
和task2
都已完成。
对于第二个例子,同样适用于尝试获得结果的地方。
var result1 = task1.Result;
var result2 = task2.Result;
由于任务已经完成,你不会阻止任何线程调用线程或任何上下文切换等。
<强>更新强>
这两种方法之间存在的唯一功能差异是错误处理不同。 await
仅展开AggregateException
,而.Result
只会引发异常。