fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5.  
  6. namespace Recetas.Multithreading.R0408
  7. {
  8. public class EjecuionMultiplesTareas
  9. {
  10. public static void Main()
  11. {
  12. Console.WriteLine ();
  13.  
  14. Task<int> tarea1 = new Task<int>( () => Tarea("Tarea No. 1", 3));
  15. Task<int> tarea2 = new Task<int>( () => Tarea("Tarea No. 2", 2));
  16. var tareaCompuesta = Task.WhenAll(tarea1, tarea2);
  17.  
  18. // Continuación para la tarea compuesta:
  19. tareaCompuesta.ContinueWith( t =>
  20. Console.WriteLine ("Primera respuesta {0}, segunda respuesta: {1}.",
  21. t.Result[0], t.Result[1]));
  22.  
  23. // Inicio ejecución tareas:
  24. tarea1.Start();
  25. tarea2.Start();
  26.  
  27. // Suspensión temporal:
  28. Thread.Sleep(TimeSpan.FromSeconds(4));
  29.  
  30. Console.WriteLine ();
  31.  
  32. // Conjunto de tareas:
  33. var tareas = new List<Task<int>>();
  34.  
  35. // Creación conjunto de tareas:
  36. for (int i = 3; i < 6; ++i)
  37. {
  38. int contador = i;
  39. Task<int> tarea = new Task<int>( () => Tarea(
  40. String.Format("Tarea No. {0}", contador), contador));
  41. tareas.Add(tarea);
  42. tarea.Start();
  43. }
  44.  
  45. // Mientras que hayan tareas por terminar:
  46. while (tareas.Count > 0)
  47. {
  48. // Obtiene cualquiera de las tareas que haya terminado:
  49. var tareaCompletada = Task.WhenAny(tareas).Result;
  50.  
  51. // Elimina la tarea que ya terminó de la lista:
  52. tareas.Remove(tareaCompletada);
  53.  
  54. // Muestra en la salida estándar el resultado de la tarea terminada:
  55. Console.WriteLine ("La tarea que acaba de terminar generó como resultado: {0}.",
  56. tareaCompletada.Result);
  57. }
  58.  
  59. Console.WriteLine ();
  60. }
  61.  
  62. public static int Tarea(string nombre, int duracion)
  63. {
  64. Console.WriteLine("La tarea `{0}` se está ejecutando en el ID de Thread {1}. "
  65. + "¿Thread en pool de threads?: {2}", nombre,
  66. Thread.CurrentThread.ManagedThreadId,
  67. Thread.CurrentThread.IsThreadPoolThread);
  68.  
  69. // Simulación de ejecución tardía:
  70. Thread.Sleep (TimeSpan.FromSeconds(duracion));
  71.  
  72. return 42 * duracion;
  73. }
  74. }
  75. }
Success #stdin #stdout 0.07s 33536KB
stdin
Standard input is empty
stdout
La tarea `Tarea No. 1` se está ejecutando en el ID de Thread 4. ¿Thread en pool de threads?: True
La tarea `Tarea No. 2` se está ejecutando en el ID de Thread 5. ¿Thread en pool de threads?: True
Primera respuesta 126, segunda respuesta: 84.

La tarea `Tarea No. 3` se está ejecutando en el ID de Thread 4. ¿Thread en pool de threads?: True
La tarea `Tarea No. 4` se está ejecutando en el ID de Thread 5. ¿Thread en pool de threads?: True
La tarea `Tarea No. 5` se está ejecutando en el ID de Thread 6. ¿Thread en pool de threads?: True
La tarea que acaba de terminar generó como resultado: 126.
La tarea que acaba de terminar generó como resultado: 168.
La tarea que acaba de terminar generó como resultado: 210.