【发布时间】:2014-03-19 01:14:12
【问题描述】:
我有一个这样创建的任务列表:
public async Task<IList<Foo>> GetFoosAndDoSomethingAsync()
{
var foos = await GetFoosAsync();
var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList();
...
}
通过使用.ToList(),任务应该全部启动。现在我想等待他们完成并返回结果。
这适用于上述... 块:
var list = new List<Foo>();
foreach (var task in tasks)
list.Add(await task);
return list;
它可以满足我的要求,但这似乎很笨拙。我宁愿写一些像这样更简单的东西:
return tasks.Select(async task => await task).ToList();
... 但这不会编译。我错过了什么?还是不能这样表达?
【问题讨论】:
-
您是否需要为每个 foo 串行处理
DoSomethingAsync(foo),或者这是 Parallel.ForEach<Foo> 的候选者? -
@mdisibio -
Parallel.ForEach正在阻塞。这里的模式来自 Jon Skeet 的Asynchronous C# video on Pluralsight。它在没有阻塞的情况下并行执行。 -
@mdisibio - 不。它们并行运行。 Try it。 (此外,如果我只想使用
WhenAll,我似乎不需要.ToList()。) -
点了。根据
DoSomethingAsync的编写方式,该列表可能会或可能不会并行执行。我能够编写一个测试方法和一个不是的版本,但在任何一种情况下,行为都是由方法本身决定的,而不是由创建任务的委托决定。很抱歉混淆了。但是,如果DoSomethingAsyc返回Task<Foo>,那么委托中的await并不是绝对必要的……我认为这是我要尝试提出的主要观点。 -
GetFoosAsync()返回什么? @MattJohnson-品脱
标签: c# linq async-await