Mat*_*int 81 c# linq async-await
我有一个我创建的任务列表,如下所示:
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)
...但这不会编译.我错过了什么?或者是不可能以这种方式表达事物?
Ste*_*ary 126
LINQ不能与async代码完美配合,但您可以这样做:
var tasks = foos.Select(DoSomethingAsync).ToList();
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
如果您的任务都返回相同类型的值,那么您甚至可以这样做:
var results = await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
这很不错.WhenAll返回一个数组,所以我相信你的方法可以直接返回结果:
return await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
为了扩展Stephen的答案,我创建了以下扩展方法以保持流畅的LINQ 风格.然后你可以做
await someTasks.WhenAll()
namespace System.Linq
{
public static class IEnumerableExtensions
{
public static Task<T[]> WhenAll<T>(this IEnumerable<Task<T>> source)
{
return Task.WhenAll(source);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54533 次 |
| 最近记录: |