#HowTo Await múltiples métodos Async en C# usando Tasks.

csharp_logo

En este post te voy a explicar como puedes hacer await de varios métodos async en C# usando Tasks.

Antes de empezar.

  • Procesamiento paralelo y procesamiento asíncrono no son exactamente lo mismo, aunque estos dos enfoques tienen montones de similitudes.
  • No existe un mecanismo transparente para esperar varios métodos asíncronos en C#.
  • En el momento en que pones en espera al menos un método asíncrono, ya lo vuelves síncrono.
  • No hay una única manera de tratar con este problema, la que te voy a explicar es una de varias soluciones que puedes aplicar para lidiar con el problema de esperar métodos asíncronos.
  • No hay solución perfecta, todas las soluciones que encuentres tienen ventajas y desventajas.
  • El manejo de excepciones de las Tasks y de los métodos asíncronos, no es el mismo. Para el caso de este post, vamos a ver el manejo de excepciones vía Tasks (AggregateException).

¿Cuándo aplicar esta solución?.

La solución para esperar tareas orientada a Task aplica cuando necesitas que todos, o al menos una parte de los procesos que correrán en conjunto finalicen al mismo tiempo. Esto lo puedes hacer con  Tasks.WaitAll() y métodos síncronos, o con Tasks.WaitAll() y métodos asíncronos. La ventaja que ofrecen los métodos async en este caso es que no tienes que  instancia, ni componer Tasks, Actions y/o Funcs.

Manejar excepciones.

El manejo de excepciones se va a hacer mediante Tasks, este consiste en atrapar una AggregateException, la cual contiene las excepciones que se arrojaron en los procesos ejecutados en paralelo. No es posible obtener excepciones individuales por proceso en este ejemplo.

Cosas a tener en cuenta.

  • Cuando esperas múltiples tareas y una arroja una excepción, puede afectar la consulta de otras Tasks vecinas. Si en tus reglas de negocio, que una tarea vecina falle causa la terminación del proceso, entonces, no habrá problema. Por el contrario, si la falla de una Task no debería causar que las Tasks vecinas  se terminen. Entonces deberías contemplar el código que maneje todas las excepciones posibles en tus métodos asíncronos.
  • Puedes inicializar tareas como async, si no quieres tener que lidiar con manejar AggregateException.
  • Es recomendable tener más de un método async en espera, de lo contrario estás generando redundancias innecesarias.
  • La cancelación por token, es manual. El método async en cuestión debería recibir el token de cancelación y validarlo antes de su ejecución.

Esperando los métodos Async/Tasks.

 

 

 

 

Gustavo Sánchez