¿Cual es la diferencia entre Task.WaitAll y Task.WhenAll en C#?

csharp_logo

En este post te voy a explicar las diferencias entre los métodos Task.WaitAll y Task.WhenAll en C#.

Antes de empezar.

  • Ambos métodos sirven para trabajar en paralelo la ejecución de Tasks y/o métodos async.
  • Los métodos en cuestión entregarán el control una vez que hayan finalizado.
  • En la mayoría de los casos su uso es intercambiable, y usar uno u otro no te va a ofrecer alguna mejora de desempeño.

Entonces, ¿Cuáles son las diferencias?.

  • Task.WaitAll es bloqueante, esto significa que ninguna sentencia posterior y que este dentro del método que ejecuta Task.WaitAll podrá ejecutarse hasta que el componente haya finalizado o arroje error.
  • Task.WaitAll maneja el sistema de errores mediante AggregateExceptions, vas a tener que inspeccionar los InnerExceptions para hacer el manejo de errores.
  • Task.WaitAll no retorna resultados,  debes asignar las Tasks a una variable, de lo contrario las perderás los Results.
  • Task.WhenAll es awaitable, esto significa que tendrás que hacer uso de la palabra reservada await o forzar a la Task  a esperar de algún modo.
  • Task.WhenAll desempaca las AggregateExceptions, si ocurre algún error en tus Tasks paralelas, se arrojara el primer error producido por las estas.
  • Task.WhenAll puede retornar los Results en la tarea que crea, no es necesario mantener las Tasks en una variable si solo necesitas el resultado de estas.
  • Si usas await con Task.WhenAll, es posible que tengas que convertir el método de cuestión a async.

Procesamiento con Task.WaitAll().

Procesamiento con Task.WhenAll().