我一直在研究如何将异步方法合并到我的MVC控制器中,特别是利用并行执行的潜力。
我发现time()特别有帮助。然而,有一个概念我很欣赏澄清。我上面链接的文章使用以下代码并行执行一系列I / O绑定方法:
var widgetTask = widgetService.GetWidgetsAsync();
var prodTask = prodService.GetProductsAsync();
var gizmoTask = gizmoService.GetGizmosAsync();
await Task.WhenAll(widgetTask, prodTask, gizmoTask);
var pwgVM = new ProdGizWidgetVM(
widgetTask.Result,
prodTask.Result,
gizmoTask.Result
);
我想知道的是这与以下代码的区别:
var widgetTask = widgetService.GetWidgetsAsync();
var prodTask = prodService.GetProductsAsync();
var gizmoTask = gizmoService.GetGizmosAsync();
var pwgVM = new ProdGizWidgetVM(
await widgetTask,
await prodTask,
await gizmoTask
);
根据我的理解,这两个代码块是等价的。那是对的吗?如果没有,那么如果有人可以解释这种差异并建议哪种情况在我的情况下更可取则会很棒。
答案 0 :(得分:0)
1将并行执行所有3个任务,但不一定按顺序执行
当所有内部任务完成时, Task.WhenAll
完成。 widgetTask
将执行到第一次等待,然后在异步等待io绑定工作时,prodTask
将执行到第一次等待,同时仍在等待前两个任务完成,{{ 1}}将被执行到它的第一个等待。然后在所有3个并行完成io-bound工作后,它们将运行完成。在此之后,gizmoTask
也会报告完成情况。
2将按照给定的顺序并行执行所有3个任务
Task.WhenAll
将开始,然后widgetTask
将开始,然后prodTask
。你开始等待gizmoTask
。完成后,它将返回,此任务中的非io绑定代码将运行。完成后,将等待widgetTask
。由于它的io-bound工作发生了异步,它可能已经完成,因此这将非常快。完成io-bound工作后,将调用prodTask
内部等待之后的代码。 prodTask
通常你想要版本1而不是版本2,只要你不关心执行任务中等待代码的顺序。