fork download
  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. }
Success #stdin #stdout 0.07s 29472KB
stdin
Standard input is empty
stdout
Estado ejecución tarea no. 1: Created.
Estado ejecución tarea: Canceled.
La primera tarea se ha cancelado antes de iniciar su ejecución.

La tarea `Tarea No. 2` se está ejecutando en el ID de Thread 4. ¿Thread en pool de threads?: True
Estado ejecución tarea no. 2: Running.
Estado ejecución tarea no. 2: Running.
Estado ejecución tarea no. 2: RanToCompletion.
Estado ejecución tarea no. 2: RanToCompletion.
Estado ejecución tarea no. 2: RanToCompletion.
RanToCompletion
RanToCompletion
RanToCompletion
RanToCompletion
RanToCompletion

La tarea no. 2 se completó satisfactoriamente y su resultado es: 420.