jueves, 24 de marzo de 2016

Receta Multithreading en C# No. 3-7: Cómo Usar el Componente de Asincronismo BackgroundWorker

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 El modelo BackgroundWorker
5.2 Clase BackgroundWorker
6. Práctica: Uso de la Clase BackgroundWorker
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Esta última receta de la serie de recetas Uso de un Pool de Threads explica cómo usar el componente de asincronismo BackgroundWorker. Este componente consiste en un enfoque alternativo para la programación asincrónica. Gracias a su modelo de asincronismo es posible, como se muestra en la sección práctica, organizar una implementación de código asincrónica como un conjunto de eventos y manejadores de eventos.

2. Palabras Clave

  • Asincronismo
  • BackgroundWorker
  • Evento
  • Manejador de evento
  • Subscriptor
  • Thread

3. Problema

Buscar un mecanismo de organización de código asincrónico basado en eventos y manejadores de eventos.

4. Solución

Con el modelo BackgroundWorker se cuenta con un componente de asincronismo basado en eventos y manejadores de eventos.

5. Discusión de la Solución

5.1 El modelo BackgroundWorker

Este modelo de asincronismo está basado en eventos. Un evento constituye una fuente de algún tipo de notificación. Y un conjunto de subscriptores que responden de un modo específico al evento generado.

Para dar respuesta a un evento generado se debe de escribir manejadores de eventos. Estos manejadores de eventos son métodos con una firma de definición especial que son invocados en respuesta a la notificación de un evento hacia sus subscriptores (Agafonov, 2013).

Por otro lado, vale mencionar que con el modelo de asincronismo que provee este componente resulta fácil escribir interfaces gráficas de usuario que responden a operaciones de larga duración sin bloquear otros procesos u operaciones que pudieran ejecutarse sobre un thread de segundo plano ("How to: Use a Background Worker", 2016).

5.2 Clase BackgroundWorker

La clase BackgroundWorker ("BackgroundWorker Class", 2016) facilita al programador la escritura de código asincrónico siguiendo el modelo de eventos (descrito en la sección anterior). Para lograr la ejecución operaciones asincrónicas, la implementación de esta clase crea un nuevo thread dedicado para la operación asincrónica.

Esta clase cuenta con los elementos de programa para:
  • Iniciar la ejecución de operaciones asincrónicas: RunWorkerAsync()
  • Conocer el estado de ejecución de una operación asincrónica: ReportProgress()
  • Cancelación de una operación asincrónica: CancelAsync()
Como se menciona en "BackgroundWorker Class" (2016), implementaciones como descargas y transacciones de bases de datos son candidatas aptas para la creación y uso de un objeto de la clase BackgroundWorker.

6. Práctica: Uso de la Clase BackgroundWorker

En el siguiente ejemplo práctico se demuestra una implementación del componente BakgroundWorker para la ejecución de una operación asincrónica que reporta su estado de progreso porcentual de ejecución.

En las líneas 40-68 se declara el evento Worker_DoWork que ejecuta la operación asincrónica en una thread dedicado. En esencia, esto es lo que ocurre en este método:
  • Línea 43: anuncio de inicio de operación asincrónica.
  • Línea 46: obtención del objeto BackgroundWorker para determinar tanto si la operación ha sido cancelada como para notificar el avance porcentual de la ejecución de la operación asincrónica.
  • Línea 64: simula la ejecución extendida de la operación asincrónica.
  • Línea 67: asignación del código de finalización de la operación asincrónica una vez ésta termine.
El evento Worker_ProgressChanged se declara en las líneas 71-74. Con este método se notifica el estado de avance porcentual de la ejecución de la operación asincrónica.

Por otro lado, en las líneas 77-93 el evento Worker_Completed se declara para anunciar la terminación de la ejecución de la operación asincrónica.

En el método Main (líneas 9-36) se crea una instancia de BackgroundWorker (línea 11) para la ejecución de la operación asincrónica implementada en Worker_DoWork. En las líneas 16-20 se indican los eventos implementados que responden al inicio de la operación asincrónica, de reporte de progreso, y de finalización de operación asincrónica.

Compilación:

csc /t:exe AsincronismoBackgroundWorker.cs

Ejecución assembly:

.\AsincronismoBackgroundWorker.exe

Demostración ejecución (ideone.com): http://ideone.com/CjopaA

Demostración ejecución (local):
Ejecución assembly AsincronismoBackgroundWorker.exe
Animación 1. Ejecución assembly AsincronismoBackgroundWorker.exe.

7. Conclusiones

Se creó una implementación en código C# para demostrar la capacidad de asincronismo basado en eventos que facilita crear el componente BackgrounWorker. Este modelo estructurado facilita, como se demostró en la sección práctica, modular la escritura de código asincrónico.

En la próxima receta de multithreading en C#, se da inicio a la serie de recetas dedicadas la librería Task Parallel Library.

8. Literatura & Enlaces

Agafonov, E. (2013). Multithreading in C# 5.0 Cookbook. United States: Packt Publishing.
How to: Use a Background Worker (2016, marzo 24). Recuperado desde: https://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx
BackgroundWorker Class (System.ComponentModel) (2016, marzo 24). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx


V

No hay comentarios:

Publicar un comentario

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