Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 带循环的异步控制器动作_Asp.net Mvc_Async Await - Fatal编程技术网

Asp.net mvc 带循环的异步控制器动作

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.

如何编写一个由1+n个异步调用(
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);