using System; using System.Threading; using System.Threading.Tasks; namespace Recetas.Multithreading.R0406 { public class CancelacionEjecucionTarea { public static void Main() { Console.WriteLine (); // Creación del manejador de cancelación: var cts = new CancellationTokenSource(); // Creación de la tarea de ejecución extendida: var tarea = new Task(() => TareaExtendida("Tarea No. 1", 10, cts.Token), cts.Token); // Visualización del estado de ejecución de la tarea: Console.WriteLine ("Estado ejecución tarea no. 1: {0}.", tarea.Status); // Emisión de la señal de cancelación: cts.Cancel(); // Visualización del estado de ejecución de la tarea: Console.WriteLine ("Estado ejecución tarea: {0}.", tarea.Status); Console.WriteLine ("La primera tarea se ha cancelado antes de iniciar su ejecución.\n"); // Nuevo token de cancelación: cts = new CancellationTokenSource(); // Segunda tarea de ejecución extendida: tarea = new Task(() => TareaExtendida("Tarea No. 2", 10, cts.Token), cts.Token); // Inicio de la ejecución de la segunda tarea: tarea.Start(); // Por cada iteración se visualiza el estado de ejecución de la segunda tarea: for (int i = 1; i <= 5; ++i) { Thread.Sleep(TimeSpan.FromSeconds(0.5)); Console.WriteLine ("Estado ejecución tarea no. 2: {0}.", tarea.Status); } // Después de haber sido cancelada la ejecución de la tarea no. 2 // se vuelve a comprbar su estado de ejecución: for (int i = 1; i <= 5; ++i) { Thread.Sleep(TimeSpan.FromSeconds(0.1)); Console.WriteLine (tarea.Status); } // Emisión de la señal de cancelación para la segunda tarea: cts.Cancel(); // Se visualiza el resultado computado por la tarea no. 2: Console.WriteLine ("\nLa tarea no. 2 se completó satisfactoriamente y su resultado es: {0}.\n", tarea.Result); } private static int TareaExtendida(string nombre, int duracion, CancellationToken token) { Console.WriteLine("La tarea `{0}` se está ejecutando en el ID de Thread {1}. " + "¿Thread en pool de threads?: {2}", nombre, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); for (int i = 1; i <= duracion; ++i) { // Simula la ejecución extendida de este método: Thread.Sleep(TimeSpan.FromSeconds(0.1)); // Comprueba si se ha emitido la señal de // cancelación de la tarea: if (token.IsCancellationRequested) { return -1; } } // Cuando la tarea se ha ejecutado satisfactoriamente llega esta punto: return 42 * duracion; } } }