Advertisement
Fhernd

CancelacionEjecucionTarea.cs

Jun 21st, 2016
2,354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.50 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Recetas.Multithreading.R0406
  6. {
  7.     public class CancelacionEjecucionTarea
  8.     {
  9.         public static void Main()
  10.         {
  11.             Console.WriteLine ();
  12.            
  13.             // Creación del manejador de cancelación:
  14.             var cts = new CancellationTokenSource();
  15.            
  16.             // Creación de la tarea de ejecución extendida:
  17.             var tarea = new Task<int>(() =>
  18.                 TareaExtendida("Tarea No. 1", 10, cts.Token), cts.Token);
  19.                
  20.             // Visualización del estado de ejecución de la tarea:
  21.             Console.WriteLine ("Estado ejecución tarea no. 1: {0}.", tarea.Status);
  22.            
  23.             // Emisión de la señal de cancelación:
  24.             cts.Cancel();
  25.            
  26.             // Visualización del estado de ejecución de la tarea:
  27.             Console.WriteLine ("Estado ejecución tarea: {0}.", tarea.Status);
  28.             Console.WriteLine ("La primera tarea se ha cancelado antes de iniciar su ejecución.\n");
  29.            
  30.             // Nuevo token de cancelación:
  31.             cts = new CancellationTokenSource();
  32.            
  33.             // Segunda tarea de ejecución extendida:
  34.             tarea = new Task<int>(() =>
  35.                 TareaExtendida("Tarea No. 2", 10, cts.Token), cts.Token);
  36.                
  37.             // Inicio de la ejecución de la segunda tarea:
  38.             tarea.Start();
  39.            
  40.             // Por cada iteración se visualiza el estado de ejecución de la segunda tarea:            
  41.             for (int i = 1; i <= 5; ++i)
  42.             {
  43.                 Thread.Sleep(TimeSpan.FromSeconds(0.5));
  44.                 Console.WriteLine ("Estado ejecución tarea no. 2: {0}.", tarea.Status);
  45.             }
  46.            
  47.             // Después de haber sido cancelada la ejecución de la tarea no. 2
  48.             // se vuelve a comprbar su estado de ejecución:
  49.             for (int i = 1; i <= 5; ++i)
  50.             {
  51.                 Thread.Sleep(TimeSpan.FromSeconds(0.1));
  52.                 Console.WriteLine (tarea.Status);
  53.             }
  54.            
  55.             // Emisión de la señal de cancelación para la segunda tarea:
  56.             cts.Cancel();
  57.            
  58.             // Se visualiza el resultado computado por la tarea no. 2:
  59.             Console.WriteLine ("\nLa tarea no. 2 se completó satisfactoriamente y su resultado es: {0}.\n",
  60.                 tarea.Result);
  61.         }
  62.        
  63.         private static int TareaExtendida(string nombre, int duracion,
  64.             CancellationToken token)
  65.         {
  66.             Console.WriteLine("La tarea `{0}` se está ejecutando en el ID de Thread {1}. "
  67.                 + "¿Thread en pool de threads?: {2}", nombre,
  68.                 Thread.CurrentThread.ManagedThreadId,
  69.                 Thread.CurrentThread.IsThreadPoolThread);
  70.                
  71.             for (int i = 1; i <= duracion; ++i)
  72.             {
  73.                 // Simula la ejecución extendida de este método:
  74.                 Thread.Sleep(TimeSpan.FromSeconds(0.1));
  75.                
  76.                 // Comprueba si se ha emitido la señal de
  77.                 // cancelación de la tarea:
  78.                 if (token.IsCancellationRequested)
  79.                 {
  80.                     return -1;
  81.                 }
  82.             }
  83.            
  84.             // Cuando la tarea se ha ejecutado satisfactoriamente llega esta punto:
  85.             return 42 * duracion;
  86.         }
  87.     }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement