C# IQueryable<;T>;和异步/等待

C# IQueryable<;T>;和异步/等待,c#,asynchronous,async-await,iqueryable,C#,Asynchronous,Async Await,Iqueryable,让我们举一个非常简单的例子。这两者之间的区别是什么: var sublist = Task.WhenAll(list.Select(x => x.getYAsync())); 这是: var sublist = Task.WhenAll(list.Select(async x => await x.getYAsync())); 在这两种情况下,子列表的类型是相同的,因此唯一的区别是语义。一个表现比另一个好吗?一个是否比另一个更标准?唯一显著的区别在于异常传播 如果getYAsyn

让我们举一个非常简单的例子。这两者之间的区别是什么:

var sublist = Task.WhenAll(list.Select(x => x.getYAsync()));
这是:

var sublist = Task.WhenAll(list.Select(async x => await x.getYAsync()));

在这两种情况下,
子列表
的类型是相同的,因此唯一的区别是语义。一个表现比另一个好吗?一个是否比另一个更标准?

唯一显著的区别在于异常传播

如果
getYAsync
抛出一个未存储在返回任务中的异常*,则第一个选项在调用
task.WhenAll
时将出现异常,而第二个选项将在从
task.WhenAll
返回的任务中存储异常,等待该任务时将抛出该异常

除此之外,还有在
async
lambda中构建的状态机,它有一些(非常小的)开销

第一个选项的性能稍好,而第二个选项比另一个更标准。 更安全的选择是显式地声明
async
await
,但在这种简单的情况下,它有些冗余

*例如:
Task getYAsync(){throw new Exception();return Task.Delay(1)}