gpt4 book ai didi

asp.net-mvc - 带循环的异步 Controller Action

转载 作者:行者123 更新时间:2023-12-01 11:49:01 24 4
gpt4 key购买 nike

我将如何编写一个由 1 + n 个异步调用 (await) 组成的异步 Controller 操作?例如。假设我需要首先检索对象 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());
}

最佳答案

好吧,首先要弄清楚的是您是真的想要并行性,还是仅仅想要异步性。只是异步很简单:

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 返回一个任务,该任务将在所有子任务完成后完成。

关于asp.net-mvc - 带循环的异步 Controller Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13495874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com