martes, 21 de junio de 2016

Receta Multithreading en C# No. 4-6: Cancelar la Ejecución de una Tarea

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 CancellationTokenSource
6. Práctica: Cancelación de la Ejecución de una Tarea
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Una operación larga -como una descarga de archivo, conexión a una base de datos, o cómputo matemático complejo (determinante de una matriz), entre otros- puede tomar una considerable cantidad de tiempo en completarse, y puede ocurrir eventualmente que el usuario o el mismo sistema ordene o emita una señala para la cancelación de la ejecución por diferentes motivos: los datos del cómputo ya no son necesarios, los datos obtenidos son suficientes y necesarios, ralentización del sistema debido a las limitaciones del poder de cómputo. Esta receta multithreading enseña al programador cómo implementar el mecanismo de cancelación de una tarea usando la construcción CancellationTokenSource.

2. Palabras Clave

  • CancellationTokenSource
  • Ejecución extendida
  • Infraestructura computacional
  • Tarea

3. Problema

Implementar la opción de cancelación de ejecución de una tarea de cómputo extendido.

4. Solución

A través del elemento de programa CancellationTokenSource el programador puede implementar la cancelación de la ejecución de una tarea.

5. Discusión de la Solución

5.1 CancellationTokenSource

(Nota: En la sección 3.2 de Receta Multithreading en C# No. 3-4: Cancelación Ejecución de una Operación Asincrónica se describe esta clase del namespace System.Threading.)

6. Práctica: Cancelación de la Ejecución de una Tarea

En este ejemplo se presenta cómo efectivamente a través del elemento de programa CancellationTokenSource se puede cancelar la éjecución de una tarea.

En las líneas 63-86 se declara el método Tarea para simular la ejecución de un proceso de duración extendido. En este método, precisamente en la línea 78, a través de la expresión if (token.IsCancellationRequested) se comprueba, tras cada iteración, si se ha emitido una señal de cancelación por parte de un objeto CancellationTokenSource.


Por otro lado, sobre la línea 14 se crea un objeto CancellationTokenSource que contiene la propiedad Token para ser pasada al constructor de Task. El propósito es cargar la responsabilidad al objeto Task, el cual cuenta con la infraestructura para administrar la cancelación del proceso en cuestión: en este caso el invocado con la expresión lambda de las líneas 17 y 18.


Casi inmediatamente después de la instanciación del objeto Task, en la línea 24 se cancela la ejecución de la tarea. Con las invocaciones a Console.WriteLine se muestra el estado de ejecución de esta primera tarea.


Más adelante se crea una nueva tarea que antes de invocar el método Cancel se invoca a Start. La tarea se ejecuta y retorna el resultado esperado acorde a los valores pasados al método asincrónico Tarea.


Compilación: 

csc /t:exe CancelacionEjecucionTarea.cs


Ejecución assembly

.\CancelacionEjecucionTarea.exe


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


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

7. Conclusiones

Se demostró que por medio de CancellationTokenSource es simple y directo implementar el mecanismo de cancelación de la ejecución de un proceso de duración extendida. Este tipo de conocimiento facilita al programador .NET escribir aplicaciones que estén compuestas de procesos de cómputo exigente y que el usuario o el mismo sistema tenga la posibilidad de cancelar procesos de acuerdo a las condiciones computacionales de infraestructura o requerimientos lógicos de la aplicación.

La siguiente receta multithreading será muy interesante: el programador comprenderá cómo gestionar la generación de excepciones en una tarea.

8. Literatura & Enlaces

Agafonov, E. (2013). Multithreading in C# 5.0 Cookbook. United States: Packt Publishing.
Receta Multithreading en C# No. 3-4: Cancelación Ejecución de una Operación Asincrónica (2016, junio 21). Recuperado desde: http://ortizol.blogspot.com.co/2015/07/receta-multithreading-en-csharp-no-3-4-cancelacion-ejecucion-de-una-operacion-asincronica.html
CancellationTokenSource Class (System.Threading) (2016, junio 21). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396


V

No hay comentarios:

Publicar un comentario

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