我有一个我创建的任务列表:
public async Task<IList<Foo>> GetFoosAndDoSomethingAsync()
{
var foos = await GetFoosAsync();
var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList();
...
}
通过使用 .ToList()
,任务应该全部开始。现在我想等待它们完成并返回结果。
这适用于上面的 ...
block :
var list = new List<Foo>();
foreach (var task in tasks)
list.Add(await task);
return list;
它做了我想要的,但这看起来很笨拙。我宁愿写一些像这样更简单的东西:
return tasks.Select(async task => await task).ToList();
...但这无法编译。我错过了什么?还是无法用这种方式表达?
最佳答案
LINQ 不能与 async
代码完美配合,但您可以这样做:
var tasks = foos.Select(DoSomethingAsync).ToList();
await Task.WhenAll(tasks);
如果您的任务都返回相同类型的值,那么您甚至可以这样做:
var results = await Task.WhenAll(tasks);
这很不错。 WhenAll
返回一个数组,所以我相信你的方法可以直接返回结果:
return await Task.WhenAll(tasks);
关于c# - 如何使用 LINQ 异步等待任务列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868087/