lunes, 20 de junio de 2016

Receta Multithreading en C# No. 4-5: Cómo Convertir una Implementación en EAP en TPL

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 TaskCompletionSource<T>
6. Práctica: Conversión de EAP to TPL
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

A pesar de que EAP (o Event-based Asynchronous Pattern) permite al programador crear aplicaciones multihilo a la vez que hace transparente la complejidad inherente de la gestión de múltiples hilos de ejecución, TPL (Task Parallel Library) ofrece un nuevo modelo para la construcción de aplicaciones que demanden una complejidad de procesamiento paralelo más intrincado y retador. En la receta multithreading anterior se demostró cómo realizar la conversión de APM (Asynchronous Programming Model) a TPL, en esta receta el programador entenderá los básicos para realizar la conversión de EAP a TPL con un ejemplo práctico en el que se hace uso de la construcción genérica TaskCompletionSource<T>.

2. Palabras Clave

  • Asincronismo
  • EAP
  • APM
  • Thread
  • TPL

3. Problema

Convertir una implementación en EAP (Event-based Asynchronous Pattern) a TPL.

4. Solución

La construcción TaskCompletionSource<T> controla la finalización de una operación asincrónica externa, en este caso la del evento RunWorkerCompleted de BackgroundWorker.

5. Discusión de la Solución

5.1 TaskCompletionSource<T>

A través de TaskCompletionSource<T> ("taskCompletionSource(TResult) Class", 2016) el programador puede controlar la finalización de un proceso asincrónico externo. Esto es de enorme utilidad para la conversión de EAP a TPL.

Para este de  conversión, TaskCompletionSource<T> actúa como intermediario para controlar la completitud del evento RunWorkerCompleted ("BackgroundWorker.RunWorkerCompleted Event", 2016). Una vez este evento ocurre, el control de asignación de valores de error, cancelación u obtención de resultados pasa a una instancia de esta clase del namespace System.Threading.Tasks.

6. Práctica: Conversión de EAP a TPL

Este ejemplo demuestra una codificación en C# por medio de la cual el elemento de programa TaskCompletionSource manipula o controla la completitud de un thread creado por un objeto BackgroundWorker (el cual forma parte del modelo de asincronismo EAP).

El método Tarea (líneas 53-64) simula la implementación de un proceso de ejecución extendida.


En Main (líneas 10-50) ocurren las siguientes acciones: 
  • Línea 14: Creación de una instancia de TaskCompletionSource con el tipo paramétrico int.
  • Línea 16: Creación de un objeto BackgroundWoker para la ejecución de un proceso asincrónico.
  • Líneas 19-23: Ajuste del proceso que ha de ejecutarse de forma asincrónica; en este caso Tarea.
  • Líneas 25-41: Aquí es donde entra en acción la instancia de TaskCompletionSource<T> creada previamente. El control de flujo de la expresión lambda comprueba varios atributos del objeto eventArgs: ocurrencia de error, cancelación de la tarea, y la asignación del resultado de la ejecución asincrónica del método Tarea.
  • Línea 44: Invocación para dar inicio a la ejecución asincrónica de Tarea por medio del objeto BackgroundWorker.
  • Línea 47: Finalmente, se asigna a una variable entera el valor computado asincrónicamente por Tarea.
Compilación: 

csc /t:exe ConversionEAPaTPL.cs

Ejecución assembly

.\ConversiónEAPaTPL.exe


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

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

7. Conclusiones

Se demostró cómo a través de TaskCompletionSource<T> es posible convertir una implementación asincrónica bajo EAP a TPL de forma simple y directa.

La próxima receta multithreading se concentra en la implementación del mecanismo de cancelación de una tarea.

8. Literatura & Enlaces

Agafonov, E. (2013). Multithreading in C# 5.0 Cookbook. United States: Packt Publishing.
TaskCompletionSource(TResult) Class (System.Threading.Tasks) (2016, junio 20). Recuperado desde: https://msdn.microsoft.com/en-us/library/dd449174(v=vs.110).aspx
BackgroundWorker.RunWorkerCompleted Event (System.ComponentModel) (2016, junio 20). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.runworkercompleted.aspx?f=255&MSPPError=-2147217396
Receta Multithreading en C# No. 3-7: Cómo Usar el Componente de Asincronismo BackgroundWorker (2016, junio 20). Recuperado desde: http://ortizol.blogspot.com.co/2016/03/receta-multithreading-en-csharp-no-3-7-como-usar-el-componente-de-asincronismo-backgroundworker.html


V

No hay comentarios:

Publicar un comentario

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