múltiples esperas vs Task.WaitAll - ¿equivalente?

múltiples esperas vs Task.WaitAll - ¿equivalente?

La primera opción no ejecutará las dos operaciones al mismo tiempo. Ejecutará el primero y esperará su finalización, y solo entonces el segundo.

La segunda opción ejecutará ambos al mismo tiempo, pero los esperará de forma sincrónica (es decir, mientras bloquea un hilo).

No debe usar ambas opciones ya que la primera se completa más lentamente que la segunda y la segunda bloquea un hilo sin necesidad.

Debe esperar ambas operaciones de forma asíncrona con 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);
}

Tenga en cuenta que después de Task.WhenAll completó ambas tareas ya completadas, por lo que esperarlas se completa de inmediato.


Respuesta corta:No.

Task.WaitAll está bloqueando, await devuelve la tarea tan pronto como se encuentra y registra la parte restante de la función y la continuación.

El método de espera "masiva" que estaba buscando es Task.WhenAll que en realidad crea un nuevo Task que finaliza cuando se realizan todas las tareas que se entregaron a la función.

Así:await Task.WhenAll({getAllWidgetsTask, getAllFoosTask});

Eso es por el asunto del bloqueo.

Además, su primera función no ejecuta ambas funciones en paralelo. Para que esto funcione con await tendrías que escribir algo como esto:

var widgetsTask = _widgetService.GetAllWidgets();
var foosTask = _fooService.GetAllWidgets();
customer.Widgets = await widgetsTask;
customer.Foos = await foosTask;

Esto hará que el primer ejemplo actúe de manera muy similar al Task.WhenAll método.