我有一个任务列表,是这样创建的:
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();
...但这段代码无法编译。我缺少了什么?还是说用这种方式无法表达这些内容?
DoSomethingAsync(foo)
пјҢиҝҳжҳҜеҸҜд»ҘдҪҝз”ЁParallel.ForEach<Foo>жқҘ并иЎҢеӨ„зҗҶпјҹ - mdisibioParallel.ForEach
是阻塞的。这里的模式来自Jon Skeet在Pluralsight上的异步C#视频。它可以并行执行而不会阻塞。 - Matt Johnson-PintWhenAll
,看起来我不需要.ToList()
。) - Matt Johnson-PintDoSomethingAsync
的编写方式,列表可能会并行执行,也可能不会。我能够编写一个测试方法,其中一个版本是并行的,另一个版本则不是,但无论哪种情况,行为都由方法本身而非创建任务的委托所决定。对于混淆造成的困扰,我感到很抱歉。但是,如果DoSomethingAsyc
返回Task<Foo>
,那么委托中的await
并不是绝对必要的……我想这就是我要尝试表达的主要观点。 - mdisibioGetFoosAsync()
返回什么?@MattJohnson-Pint - ntrch