jueves, 23 de junio de 2016

Receta Multithreading en C# No. 4-8: Ejecutar Múltiples Tareas en Paralelo

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 WhenAll
5.2 WhenAny
6. Práctica: Ejecución Paralela de Múltiples Tareas
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

TPL (Task Parallel Library) conforma el esfuerzo de Microsoft .NET Framework por crear un modelo de ejecución de procesos de modo asincrónico coherente, robusto, y fiable que permite al programador crear poderosas aplicaciones multithreading. Se continua el avance en el desarrollo de recetas de esta categoría que presenta al programador las diferentes características que provee esta librería para la escritura de elementos de programa de ejecución paralela. Esta receta en particular hace énfasis en describir cómo ejecutar múltiples procesos de forma asincrónica y monitorizar su terminación.

2. Palabras Clave

  • Asincronismo
  • Ejecución paralela
  • Librería
  • Microsoft .NET Framework
  • Multithreading
  • TPL

3. Problema

Implementar con TPL el mecanismo de ejecución  paralela de múltiples tareas; además monitorizar su finalización para la obtención de resultados.

4. Solución

Los métodos static sobrecargados WhenAll de Task facilitan la coordinación de la terminación de tareas ejecutadas en paralelo con el método de instancia Start.

5. Discusión de la Solución

5.1 WhenAll

El método sobrecargado WhenAll crea una tarea que finaliza su ejecución una vez que todas las tareas que recibe como argumento hayan finalizado ("Task.WhenAll", 2016). Estas son sus versiones sobrecargadas: 
Versiones sobrecargadas de Task.WhenAll
Figura 1. Versiones sobrecargadas de Task.WhenAll ("Task.WhenAll Method", 2016).

5.2 WhenAny

A diferencia de WhenAll, el método static sobrecargado WhenAny ("Task.WithAny", 2016) espera a que cualquier tarea, que recibe como argumento, termine. Esto puede facilitar la suspensión de las demás tareas pendientes por finalizar o realizar cualquier otra operación, por ejemplo, con los resultados obtenidos de la o las tareas ya finalizadas.

Estas son las versiones sobrecargadas de WhenAny
Versiones sobrecargadas de Task.WhenAny
Figura 2. Versiones sobrecargadas de Task.WhenAny ("Task.WhenAny", 2016).

6. Práctica: Ejecución Paralela de Múltiples Tareas

Este ejemplo muestra cómo ejecutar múltiples tareas usando las construcciones disponibles en Task.

Se crean dos tareas con el tipo paramétrico int (el cual corresponde con el tipo de retorno del método Tarea) en las líneas 14 y 15. Con la invocación de Task.WhenAll se agrupan las dos tareas -tarea1 y tarea2- para una vez finalicen su ejecución se pase a la continuación de las líneas 19-21. Las tareas se inician con las invocaciones de Start de las líneas 24-25.


Más adelante, se crea una lista de objetos Tarea: línea 33. Esta lista será poblada con cada iteración del ciclo for de las líneas 36-43.



Con el ciclo while -líneas 46-57- se monitoriza la finalización de cada tarea con el método Task.WhenAny. Cada vez que una tarea finaliza, ésta será removida de la lista: tareas.Remove(tareaCompletada);.


Compilación: 

csc /t:exe EjecucionMultiplesTareas.cs

Ejecución assembly

.\EjecucionMultiplesTareas.exe

> Prueba de ejecución (ideone.com): http://ideone.com/kimANX

> Prueba de ejecución (local): 
Ejecución assembly EjecucionMultiplesTareas.exe
Animación 1. Ejecución assembly EjecucionMultiplesTareas.exe.

7. Conclusiones

La infraestructura del modelo TPL hace intuitiva la creación y ejecución de tareas en paralelo. Esto es lo que permite al programador crear aplicaciones multithreading robustas y comprensibles al grado de su implementación.

La próxima y última receta multithreading de la serie Uso de TPL, instruye al programador cómo crear interfaces gráficas que ejecutan procesos asincrónicos.

8. Literatura & Enlaces

Agafonov, E. (2013). Multithreading in C# 5.0 Cookbook. United States: Packt Publishing.
Task.WhenAll Method (System.Threading.Tasks) (2016, junio 23). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.whenall(v=vs.110).aspx
Task.WhenAny Method (System.Threading.Tasks) (2016, junio 23). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.whenany(v=vs.110).aspx


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.