从性能上来说,这2个方法会跑吗GetAllWidgets()
and GetAllFoos()
在平行下?
有什么理由使用其中一种而不是另一种吗?编译器在幕后似乎发生了很多事情,所以我不清楚。
============= 方法A:使用多个等待======================
public async Task<IHttpActionResult> MethodA()
{
var customer = new Customer();
customer.Widgets = await _widgetService.GetAllWidgets();
customer.Foos = await _fooService.GetAllFoos();
return Ok(customer);
}
=============== 方法B:使用Task.WaitAll =====================
public async Task<IHttpActionResult> MethodB()
{
var customer = new Customer();
var getAllWidgetsTask = _widgetService.GetAllWidgets();
var getAllFoosTask = _fooService.GetAllFos();
Task.WaitAll(new List[] {getAllWidgetsTask, getAllFoosTask});
customer.Widgets = getAllWidgetsTask.Result;
customer.Foos = getAllFoosTask.Result;
return Ok(customer);
}
=======================================
第一个选项不会同时执行这两个操作。它将执行第一个并等待其完成,然后才执行第二个。
第二个选项将同时执行两者,但将同步等待它们(即在阻塞线程时)。
您不应该使用这两个选项,因为第一个选项的完成速度比第二个选项慢,并且第二个选项会不必要地阻塞线程。
您应该异步等待这两个操作Task.WhenAll
:
public async Task<IHttpActionResult> MethodB()
{
var customer = new Customer();
var getAllWidgetsTask = _widgetService.GetAllWidgets();
var getAllFoosTask = _fooService.GetAllFos();
await Task.WhenAll(getAllWidgetsTask, getAllFoosTask);
customer.Widgets = await getAllWidgetsTask;
customer.Foos = await getAllFoosTask;
return Ok(customer);
}
请注意,之后Task.WhenAll
完成了已经完成的两项任务,因此等待它们立即完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)