Oli*_*Oli 3 asp.net-mvc async-await
我将如何编写由1 + n异步调用(await)组成的异步控制器操作?例如,让我假装我需要先检索对象Foo并且它有一个可变数量的Bars标识符,我需要获取所有这些实体(为了这个问题,没有fetchBarsByFooId.我会使用Task.WaitAll或者可能Parallel.For吗?
public async Task<ActionResult> Bars(int id) {
Foo foo = await this.FooProvider.GetFooAsync(id);
var bars = new ConcurrentQueue<Bar>();
// Sub-optimal version
foreach (int barId in foo.BarIDs) {
Bar bar = this.BarProvider.GetBar(barId);
bars.Enqueue(bar)
}
// Fetch each bar asynchronously and pass them to the view.
....
return View(bars.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
好吧,首先要解决的是你是否真的想要并行,或者只是异步.只是异步很简单:
var bars = new List<Bar>();
foreach (var id in foo.Bars)
{
bars.Add(await BarProvider.GetBarAsync(id));
}
return View(bars);
Run Code Online (Sandbox Code Playgroud)
对于并行性,您可以使用Task.WhenAll:
var tasks = foo.Bars.Select(id => BarProvider.GetBarAsync(id));
var bars = await Task.WhenAll(tasks);
return View(bars);
Run Code Online (Sandbox Code Playgroud)
(我意识到这是比非并行版本更短的代码 - 但它在概念上更棘手.)
你应该不使用Parallel.For或Task.WaitAll作为这两个被阻塞调用-而Task.WhenAll回报你一个任务,当所有的子任务已经完成,这将完成.
| 归档时间: |
|
| 查看次数: |
1434 次 |
| 最近记录: |