我有一个我创建的任务列表,如下所示:
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)
...但这不会编译.我错过了什么?或者是不可能以这种方式表达事物?
以下片段编译,但我希望它等待任务结果,而不是给我一个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)
但评论指出,不需要内部async和await内部Select():
var tasks = foos.Select(foo => DoSomethingAsync(foo)).ToList();
Run Code Online (Sandbox Code Playgroud)
这里有一个类似的问题,有人试图在其中使用异步方法Where().
因此async,await在LINQ语句中是合法的语法,但它什么都不做或者它有特定的用途?