我们来看一个非常简单的例子。有什么区别:
var sublist = Task.WhenAll(list.Select(x => x.getYAsync()));
和此:
var sublist = Task.WhenAll(list.Select(async x => await x.getYAsync()));
在这两种情况下,sublist
的类型都是相同的,因此唯一的区别是语义。一个人的表现比另一个好吗?比另一个更标准吗?
答案 0 :(得分:3)
唯一重要的区别是异常传播。
如果getYAsync
抛出未存储在返回任务中的异常*,则第一个选项在调用Task.WhenAll
时会出现异常,而第二个选项会将异常存储在从返回的任务中等待该任务时会抛出的Task.WhenAll
。
除此之外,状态机是在async
lambda中构建的,它有一些(非常小的)开销。
第一个选项稍微执行 ,而第二个选项比另一个更标准。
更安全的选择是明确说明async
和await
,但在这种简单的情况下,它有点多余。
*例如:Task getYAsync() { throw new Exception(); return Task.Delay(1)}