IQueryable and async/await
问题描述:
让我们举一个非常简单的例子。是什么这之间的区别:这IQueryable <T> and async/await
var sublist = Task.WhenAll(list.Select(x => x.getYAsync()));
:
var sublist = Task.WhenAll(list.Select(async x => await x.getYAsync()));
在这两种情况下,sublist
类型是一样的,所以唯一的区别是语义。一个人表现比另一个好吗?比另一个更标准吗?
答
关于异常传播的唯一显着差异。
如果getYAsync
抛出未存储在返回的任务异常*第一个选项调用Task.WhenAll
时,而第二个选项会存储在从Task.WhenAll
返回的任务除外,它将会被抛出时,将有一个例外任务正在等待。
除此之外,还有一个状态机在async
lambda中构建,它有一些(非常小的)开销。
第一个选项执行略微更好,而第二个选项比另一个更标准。 更安全的选择是明确指出async
和await
,但在这种简单的情况下,它有点多余。
*例如:Task getYAsync() { throw new Exception(); return Task.Delay(1)}