以下代码块中是否存在任何功能、性能或死锁风险差异?
示例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
and task2
将完成。
因此,当你写:
var result1 = await task1;
var result2 = await task2;
该代码将同步执行。你不必await
为了某件事,因为你们俩task1
and task2
就会完成。
对于第二个示例,您尝试获取结果也是如此。
var result1 = task1.Result;
var result2 = task2.Result;
由于任务已经完成,因此您不会阻止任何线程调用线程或进行任何上下文切换等。
Update
这两种方法之间存在的唯一功能差异是错误处理不同。这await
只是打开一个AggregateException
, while .Result
只会引发异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)