在性能方面,这两种方法会并行运行GetAllWidgets()和GetAllFoos()吗?
有没有理由使用一个在另一个?编译器在幕后似乎有很多事情发生,所以我不清楚.
============= MethodA:使用多个等待======================
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完成两个任务已经完成,等待他们立即完成.