C# · 12月 26, 2021

c# – 多个等待对任务.WaitAll – 等效?

在性能方面,这两种方法会并行运行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完成两个任务已经完成,等待他们立即完成.