viernes, 24 de junio de 2016

Receta Multithreading en C# No. 4-9: Ejecución de Tareas en una Interfaz de Usuario con TaskScheduler

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Windows Presentation Foundation (WPF)
5.2 TaskScheduler
6. Práctica: Código Sincrónico vs Código Asincrónico en una GUI
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Esta última receta multithreading de la serie Uso de TPL, demuestra al programador los elementos básicos para crear interfaces gráficas de usuario que respondan a múltiples tareas al mismo tiempo. Para ello será necesario explicar en qué consiste la clase TaskScheduler, y cómo los elementos integrales de una GUI, en este caso particular acciones de clic de un botón, responden a solicitudes de usuario sin bloquear el hilo de ejecución principal de toda la interfaz manteniendo la aplicación activa a otras operaciones.

2. Palabras Clave

  • Asincronismo
  • GUI
  • Hilo de ejecución
  • Sincronismo
  • TaskScheduler
  • TPL
  • Windows Presentation Foundation

3. Problema

Demostrar a través de una aplicación basada en interfaz gráfica de usuario la respuesta en paralelo a múltiples ejecuciones de tareas.

4. Solución

Un proyecto Windows Presentation Foundation (WPF) será creado para esta demostración. Se usará la clase TaskScheduler para la manipulación de tareas de bajo nivel sobre threads.

5. Discusión de la Solución

5.1 Windows Presentation Foundation (WPF)

[NotaEn la sección 5 de Tecnologías Aplicadas de .NET: Interfaces Gráficas se explica esta tecnología gráfica.]

5.2 TaskScheduler

La clase TaskScheduler permite gestionar tareas de una cola de tareas en threads. Se puede concebir a esta clase cómo un planificador que asegura que una tarea asignada en una cola de tareas se ejecute en determinado momento ("TaskScheduler Class", 2016).

De acuerdo con "TaskScheduler Class" (2016) está construcción está basada en un pool de threads implementado en la versión 4 de .NET Framework, y que provee balance de carga, alto desempeño, inyección y retiro de threads.

Esta clase es apta para cubrir un aspecto importante en la composición lógica de una interfaz gráfica de usuario, ya que permite ejecutar múltiples tareas sin bloquear o congelar la ejecución del thread principal de la aplicación.

6. Práctica: Código Sincrónico vs Código Asincrónico en una GUI

La siguiente solución en Visual Studio 2015 es un proyecto Windows Presentation Foundation (WPF) que demuestra las capacidades de código sincrónico y asincrónico -en especial-. Se usa la construcción (clase) TaskScheduler para la ejecución de código asincrónico.

En primer lugar se muestra el código XAML que representa la interfaz gráfica de usuario.


Esta interfaz está constituida por cuatro botones. El primero (líneas 20-24) responde de forma asincrónica. Los dos restantes se ejecutan de forma asincrónica. Esta es la interfaz que genera este código XAML
Ejecución aplicación R0409
Figura 1. Ejecución aplicación R0409.

Por otra parte, esta es la implementación en C# de los eventos para cada uno de los botones definidos en la interfaz:

Archivo C# MainWindow.xaml.cs [Enlace alternativo][Enlace alternativo]:

El método Tarea cuenta con las siguientes sobrecargas:
  • Líneas 82-45: No recibe argumentos y retorna el resultado de la invocación a la versión sobrecargada. Esta versión permite demostrar la diferencia entre el bloqueo del acceso a controles de la interfaz gráfica; además de la generación de una excepción cuando se intenta acceder a un control del hilo principal de la aplicación.
  • Líneas 92-106: Los tres eventos invocan de forma indirecta a esta versión sobrecargada de Tarea. La idea principal con esta sobrecarga es demostrar a través del evento del tercer botón (izquierda a derecha), tomar el control del thread principal de la aplicación. Esto ocurre con la siguiente invocación:
Task tarea = Tarea(TaskScheduler.FromCurrentSynchronizationContext());


Nótese cómo se invoca el método pasando como argumento el planificador de tareas del thread de la interfaz gráfica; de ese modo se puede manipular el estado del control `ContentTextBlock`.


En el siguiente vídeo se presenta una demostración de la ejecución de esta aplicación con las diferentes respuestas de los tres botones.

7. Conclusiones

Se demostró cómo actúa una interfaz gráfica de usuario ante una operación sincrónica y asincrónica. Esto es de gran importancia para construir aplicaciones de una mejor experiencia de usuario, y aprovechamiento de los recursos de máquina disponibles.


Con la próxima receta multithreading se inicia la exploración de las nuevas características para trabajo asincrónico en C# 5.0.

8. Literatura & Enlaces

Agafonov, E. (2013). Multithreading in C# 5.0 Cookbook. United States: Packt Publishing.
TaskScheduler Class (System.Threading.Tasks) (2016, junio 24). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Tecnologías Aplicadas de .NET: Interfaces Gráficas (2016, junio 24). Recuperado desde: http://ortizol.blogspot.com.co/2015/07/tecnologias-aplicadas-de-dotnet-parte-1-interfaces-graficas.html


V

No hay comentarios:

Publicar un comentario

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