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().
Últimas entradas de Gustavo Sánchez (ver todo)
- NVL in SQL Server - 2023-11-01
- ¿Que es Cake Build? - 2023-02-22
- #How to fix error: MSB4019: The imported project «Microsoft.Data.Tools.Schema.SqlTasks.targets» was not found - 2023-02-20