Asp.net mvc 带循环的异步控制器动作
如何编写一个由1+n个异步调用(Asp.net mvc 带循环的异步控制器动作,asp.net-mvc,async-await,Asp.net Mvc,Async Await,如何编写一个由1+n个异步调用(await)组成的异步控制器操作?例如,让我们假设我需要首先检索对象Foo,它有一个可变数量的条标识符,我需要获取所有这些实体(为了这个问题,没有fetchBarsByFooId。我会使用Task.WaitAll还是Parallel.for 公共异步任务栏(int-id){ Foo Foo=wait this.FooProvider.getfooancy(id); var bars=新的ConcurrentQueue(); //次优版本 foreach(在foo.
await
)组成的异步控制器操作?例如,让我们假设我需要首先检索对象Foo
,它有一个可变数量的条
标识符,我需要获取所有这些实体(为了这个问题,没有fetchBarsByFooId
。我会使用Task.WaitAll
还是Parallel.for
公共异步任务栏(int-id){
Foo Foo=wait this.FooProvider.getfooancy(id);
var bars=新的ConcurrentQueue();
//次优版本
foreach(在foo.barId中为int barId){
Bar=this.BarProvider.GetBar(barId);
酒吧。排队(酒吧)
}
//异步获取每个条并将其传递给视图。
....
返回视图(bar.ToArray());
}
首先要解决的问题是,你到底想要并行还是异步。异步很简单:
var bars = new List<Bar>();
foreach (var id in foo.Bars)
{
bars.Add(await BarProvider.GetBarAsync(id));
}
return View(bars);
(我意识到这比非并行版本的代码要短,但在概念上要复杂得多。)
你不应该使用
Parallel.For
或Task.WaitAll
,因为这两种方法都是阻塞呼叫-而Task.whalll
会返回一个任务,当所有子任务都完成后,该任务就会完成。在接受你的答案之前,我今晚会在回家的火车上尝试这个方法,但这看起来很好。很抱歉耽搁了,这是真的我花了一段时间将所有代码库移植到任务并行库。这非常有效!@Oli:Excellent:)Async/await:)
var tasks = foo.Bars.Select(id => BarProvider.GetBarAsync(id));
var bars = await Task.WhenAll(tasks);
return View(bars);