fork download
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Recetas.Multithreading.R0403
  6. {
  7. public class CombinacionTareas
  8. {
  9. public static void Main()
  10. {
  11. // Creación de dos tareas para ejecutar el método Proceso:
  12. var tareaNo1 = new Task<int>( () => Proceso("Tarea No. 1", 3));
  13. var tareaNo2 = new Task<int>( () => Proceso("Tarea No. 2", 2));
  14.  
  15. // Una vez terminada la ejecución de `tareaNo1`, se continua con la ejecución
  16. // de la expresión lambda de ContinueWith:
  17. tareaNo1.ContinueWith(
  18. t => Console.WriteLine ("Respuesta Tarea no. 1: {0}. ID Thread: {1}. ¿Thread de pool de threads?: {2}.",
  19. t.Result,
  20. Thread.CurrentThread.ManagedThreadId,
  21. Thread.CurrentThread.IsThreadPoolThread),
  22. TaskContinuationOptions.OnlyOnRanToCompletion
  23. );
  24.  
  25. // Inicia la ejecución asincrónica de los objetos Task:
  26. tareaNo1.Start();
  27. tareaNo2.Start();
  28.  
  29. // Detiene la ejecución del thread de `Main`
  30. // para dar tiempo de ejecución a los objetos Task:
  31. Thread.Sleep(TimeSpan.FromSeconds(4));
  32.  
  33. // Creación de tarea de continuación para responder a
  34. // la finalización de de la Tarea no. 2:
  35. Task continuacion = tareaNo2.ContinueWith(
  36. t => Console.WriteLine ("Respuesta Tarea no. 2: {0}. ID Thread: {1}. ¿Thread de pool de threads?: {2}.",
  37. t.Result,
  38. Thread.CurrentThread.ManagedThreadId,
  39. Thread.CurrentThread.IsThreadPoolThread),
  40. TaskContinuationOptions.OnlyOnRanToCompletion |
  41. TaskContinuationOptions.ExecuteSynchronously
  42. );
  43.  
  44. // Se ejecuta una vez que el objeto Task `tareaNo2` finalice:
  45. continuacion.GetAwaiter().OnCompleted(
  46. () => Console.WriteLine ("Tarea de continuación de tarea 2 se completó. ID thread: {0}. ¿Thread de pool de threads?: {1}",
  47. Thread.CurrentThread.ManagedThreadId,
  48. Thread.CurrentThread.IsThreadPoolThread)
  49. );
  50.  
  51. // Detiene la ejecución del thread de Main
  52. // para dar tiempo de ejecución a los objetos Task:
  53. Thread.Sleep(TimeSpan.FromSeconds(2));
  54. Console.WriteLine ();
  55.  
  56. // Crea otra tarea con dos tareas -una anidad y otra de continuación-:
  57. var tareaNo3 = new Task<int>( () => {
  58.  
  59. // Crea objeto Task anidado:
  60. var tareaAnidada = Task.Factory.StartNew(() =>
  61. Proceso("Tarea no. 4", 5),
  62. TaskCreationOptions.AttachedToParent
  63. );
  64.  
  65. // Una vez se complete la tarea anidada continuar con:
  66. tareaAnidada.ContinueWith( t =>
  67. Proceso("Tarea no. 5", 2),
  68. TaskContinuationOptions.AttachedToParent);
  69.  
  70. return Proceso("Tarea no. 3", 2);
  71. });
  72.  
  73. // Ejecución Tarea no. 3:
  74. tareaNo3.Start();
  75.  
  76. // Mientras que la tarea no. 3 se esté ejecutando:
  77. while(!tareaNo3.IsCompleted)
  78. {
  79. // Muestra en la salida estándar el estado actual
  80. // de ejecución del objeto Task `taskNo3`:
  81. Console.WriteLine ("Estado ejecución Tarea no. 3: {0}", tareaNo3.Status);
  82.  
  83. // Espera por ciclo:
  84. Thread.Sleep(TimeSpan.FromSeconds(0.5));
  85. }
  86.  
  87. Console.WriteLine ("\nÚltimo estado de Tarea no. 3: {0}.", tareaNo3.Status);
  88.  
  89. // Espera en thread Main hasta de 10 segundos:
  90. Thread.Sleep(TimeSpan.FromSeconds(10));
  91.  
  92. Console.WriteLine ();
  93. }
  94.  
  95. // Proceso asincrónico para objetos Task:
  96. public static int Proceso(string nombre, int segundos)
  97. {
  98. Console.WriteLine ("La {0} se está ejecutando en el ID de thread {1}. ¿Thread del pool de threads?: {2}.",
  99. nombre,
  100. Thread.CurrentThread.ManagedThreadId,
  101. Thread.CurrentThread.IsThreadPoolThread);
  102.  
  103. // Espera simulada para este método de ejecución asincrónica:
  104. Thread.Sleep(TimeSpan.FromSeconds(segundos));
  105.  
  106. return 45 * segundos;
  107. }
  108. }
  109. }
Success #stdin #stdout 0.08s 31344KB
stdin
Standard input is empty
stdout
La Tarea No. 1 se está ejecutando en el ID de thread 4. ¿Thread del pool de threads?: True.
La Tarea No. 2 se está ejecutando en el ID de thread 5. ¿Thread del pool de threads?: True.
Respuesta Tarea no. 1: 135. ID Thread: 4. ¿Thread de pool de threads?: True.
Respuesta Tarea no. 2: 90. ID Thread: 1. ¿Thread de pool de threads?: False.
Tarea de continuación de tarea 2 se completó. ID thread: 4. ¿Thread de pool de threads?: True

Estado ejecución Tarea no. 3: WaitingToRun
La Tarea no. 3 se está ejecutando en el ID de thread 6. ¿Thread del pool de threads?: True.
La Tarea no. 4 se está ejecutando en el ID de thread 4. ¿Thread del pool de threads?: True.
Estado ejecución Tarea no. 3: Running
Estado ejecución Tarea no. 3: Running
Estado ejecución Tarea no. 3: Running
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete
La Tarea no. 5 se está ejecutando en el ID de thread 4. ¿Thread del pool de threads?: True.
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete
Estado ejecución Tarea no. 3: WaitingForChildrenToComplete

Último estado de Tarea no. 3: RanToCompletion.