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

标签 c# linq async-await

我有一个我创建的任务列表:

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/

相关文章:

c# - 在异步任务仍在使用时处置流

c# - 从查找中获取键

c# - 正确使用 Task.WhenAll

python - 在 Python 中只等待一段时间

c# - 在 asp.net 中发送邮件

c# - 程序化检查或 try...catch

c# - 如何从 Windows 服务启动进程

c# - 使用 Linq 查询 List<List<string>>

c# - 无法使用 Lambda 的扩展方法访问实例变量

javascript - 为什么异步数组映射返回 promise ,而不是值