С точки зрения производительности, эти 2 метода будут запускать GetAllWidgets()
и GetAllFoos()
параллельно?несколько ожиданий против Task.WaitAll - эквивалентно?
Есть ли причина использовать один над другим? Кажется, что много чего происходит за кулисами с компилятором, поэтому я не понимаю.
============= Methoda: Использование нескольких ЖДЕТ ======================
public async Task<IHttpActionResult> MethodA()
{
var customer = new Customer();
customer.Widgets = await _widgetService.GetAllWidgets();
customer.Foos = await _fooService.GetAllFoos();
return Ok(customer);
}
=============== MethodB: Использование 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);
}
=====================================
В первом примере два метода будут вызываться последовательно, а во втором они будут выполняться параллельно, поэтому они не эквивалентны. Кроме того, во втором методе вы блокируете выполнение задач. –
MethodA выполнит '_fooService.GetAllFoos()' только тогда, когда '_widgetService.GetAllWidgets()' закончен, методB выполнит его, когда возвращается незавершенная задача из '_fooService.GetAllFoos()'. –