lunes, 11 de julio de 2016

Receta Multithreading en C# No. 5-6: Cambiar el Modo de Ejecución Asincrónica

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Método Task.ConfigureAwait()
6. Práctica: Cambio de Ejecución Asincrónico
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

El modo de operación de la invocación de una función asincrónica await puede ser alterado, por ejemplo, en la ejecución de operaciones asincrónicas de una interfaz gráfica de usuario. Esta receta multithreading en C# explica cómo usar el método ConfigureAwait() para configurar la ejecución asincrónica de código que no accede a los componentes de la interfaz gráfica de usuario. La demostración en la sección práctica enseña el uso de este método alternando entre el uso del contexto de sincronización y sin recurrir a él.

2. Palabras Clave

  • Asincronismo
  • Contexto de sincronización
  • Interfaz gráfica de usuario
  • GUI
  • Sincronismo

3. Problema

Configurar el modo de ejecución asincrónico de una tarea.

4. Solución

El método ConfigureAwait() permite la configuración del modo de ejecución asincrónico.

5. Discusión de la Solución

5.1 Método Task.ConfigureAwait()

El método ConfigureAwait() configura el modo de ejecución asincrónica de una tarea. Este método recibe como argumento un valor booleano que en caso de ser true, el modo de ejecución asincrónica captura el contexto desde donde es ejecutada la tarea; en caso contrario la tarea se debe ejecutar sin capturar el contexto de sincronización.

Esta es su firma: 

public ConfiguredTaskAwaitable ConfigureAwait(
bool continueOnCapturedContext
)

6. Práctica: Cambio de Ejecución Asincrónica

La siguiente receta C# explica cómo el programador puede cambiar el modo de ejecución asincrónica.

El método que controla el evento Click (líneas 48-69) del botón que activa las operaciones asincrónicas lleva a cabo estas operaciones: 
  • Línea 51: Asigna el texto Calculando... cuando se inicia la ejecución asincrónica de dos tareas que operan en asincronismo con y sin contexto.
  • Línea 54: Inicia la ejecución de una operación con contexto.
  • Línea 55: Inicia la ejecución de una operación sin contexto.
  • Líneas 61-65: Construcción de la cadena de resultados de las dos operaciones asincrónicas anteriores.
  • Línea 68: Asigna el nuevo texto a la etiqueta de la interfaz gráfica de usuario.
Por otra parte, con el método OperacionContexto() (líneas 75-90) realiza estas operaciones: 
  • Línea 77: Especifica el número de iteraciones que ejecuta este método asincrónico.
  • Líneas 78-79: Creación e inicio de cronómetro.
  • Líneas 81-85: Repite la ejecución de una tarea asincrónica simulada. Aquí la tarea se ejecuta capturando implícitamente el contexto de ejecución.
  • Línea 87: Se detiene el cronómetro.
  • Línea 89: Retorna el tiempo que tomó la ejecución.
De manera análoga, el método OperacionSinContexto() (líneas 96-112) ejecuta estas operaciones: 
  • Línea 98: Especifica el número de iteraciones que ejecuta este método asincrónico.
  • Líneas 99-100: Creación e inicio de cronómetro.
  • Líneas 102-107: Repite la ejecución de una tarea asincrónica simulada. A través del método ConfigureAwait() se establece que el método se debe ejecutar sin capturar el contexto de sincronismo.
  • Línea 109Se detiene el cronómetro.
  • Línea 111: Retorna el tiempo que tomó la ejecución.
Finalmente, con el método Ejecutar() (líneas 19-41) se construye la interfaz gráfica de una aplicación Windows Presentation Foundation (WPF).

Prueba de ejecución: 

7. Conclusiones

Se ha demostrado cómo a través del método ConfigureAwait() se puede alterar el modo de ejecución de una operación asincrónica: con y sin captura de contexto de sincronismo. Quedó claro que cuando no se captura el contexto el desempeño general de la aplicación es superior comparado con la captura del contexto.

Hasta ahora se ha estudiado los métodos asincrónicos que retornan un tipo paramétrico para el tipo Task, sin embargo en la siguiente receta multithreading se estudiará cómo trabajar con operaciones asincrónicas que retornan void.

8. Literatura & Enlaces

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


V

No hay comentarios:

Publicar un comentario

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