【问题标题】:IQueryable<T> and async/await [duplicate]IQueryable<T> 和 async/await [重复]
【发布时间】:2014-12-02 17:01:08
【问题描述】:
让我们举一个非常简单的例子。这有什么区别:
var sublist = Task.WhenAll(list.Select(x => x.getYAsync()));
还有这个:
var sublist = Task.WhenAll(list.Select(async x => await x.getYAsync()));
在这两种情况下,sublist 的类型是相同的,所以唯一的区别是语义。一个比另一个表现更好吗?一个比另一个更标准吗?
【问题讨论】:
标签:
c#
asynchronous
async-await
iqueryable
【解决方案1】:
唯一显着的区别在于异常传播。
如果getYAsync 抛出一个未存储在返回任务中的异常*,则第一个选项在调用Task.WhenAll 时会出现异常,而第二个选项会将异常存储在从Task.WhenAll 返回的任务中等待该任务时将被抛出。
除此之外,在 async lambda 中构建的状态机有一些(非常小的)开销。
第一个选项的性能略更好,而第二个比另一个更标准。
更安全的选择是明确声明 async 和 await,但在这种简单的情况下,它有些多余。
* 例如:Task getYAsync() { throw new Exception(); return Task.Delay(1)}