Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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<int>(() =>
- 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<int>(() =>
- 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;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement