相关疑难解决方法(0)

如何使用LINQ异步等待任务列表?

我有一个我创建的任务列表,如下所示:

public async Task<IList<Foo>> GetFoosAndDoSomethingAsync()
{
    var foos = await GetFoosAsync();

    var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList();

    ...
}
Run Code Online (Sandbox Code Playgroud)

通过使用.ToList(),任务都应该开始.现在我想等待完成并返回结果.

这适用于上面的...块:

var list = new List<Foo>();
foreach (var task in tasks)
    list.Add(await task);
return list;
Run Code Online (Sandbox Code Playgroud)

它做我想要的,但这似乎相当笨拙.我宁愿写一些更简单的东西:

return tasks.Select(async task => await task).ToList();
Run Code Online (Sandbox Code Playgroud)

...但这不会编译.我错过了什么?或者是不可能以这种方式表达事物?

c# linq async-await

81
推荐指数
2
解决办法
5万
查看次数

在LINQ语句中使用async/await时实际发生了什么?

以下片段编译,但我希望它等待任务结果,而不是给我一个List<Task<T>>.

var foo = bars.Select(async bar => await Baz(bar)).ToList()
Run Code Online (Sandbox Code Playgroud)

正如这里指出的,你需要使用Task.WhenAll:

var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList();
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)

评论指出,不需要内部asyncawait内部Select():

var tasks = foos.Select(foo => DoSomethingAsync(foo)).ToList();
Run Code Online (Sandbox Code Playgroud)

这里有一个类似的问题,有人试图其中使用异步方法Where().

因此async,await在LINQ语句中是合法的语法,但它什么都不做或者它有特定的用途?

c# linq asynchronous c#-5.0

25
推荐指数
2
解决办法
1万
查看次数

标签 统计

c# ×2

linq ×2

async-await ×1

asynchronous ×1

c#-5.0 ×1