带循环的异步控制器操作

时间:2012-11-21 14:53:23

标签: asp.net-mvc async-await

我如何编写由1 + n异步调用(await)组成的异步控制器操作?例如。让我假装我需要首先检索对象Foo并且它有一个可变数量的Bars标识符,我需要获取所有这些实体(为了这个问题,没有{{1}我会使用fetchBarsByFooId还是Task.WaitAll

Parallel.For

1 个答案:

答案 0 :(得分:5)

嗯,首先要解决的是你是否真的想要并行,或者只是异步。只是异步很简单:

var bars = new List<Bar>();
foreach (var id in foo.Bars)
{
    bars.Add(await BarProvider.GetBarAsync(id));
}
return View(bars);

对于并行性,您可以使用Task.WhenAll

var tasks = foo.Bars.Select(id => BarProvider.GetBarAsync(id));
var bars = await Task.WhenAll(tasks);
return View(bars);

(我意识到这是比非并行版本更短的代码 - 但它在概念上更棘手。)

你应该使用Parallel.ForTask.WaitAll,因为这两个阻止调用 - 而Task.WhenAll会返回一项任务这将在所有子任务完成后完成。