using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace Recetas.Multithreading.R0408 { public class EjecuionMultiplesTareas { public static void Main() { Console.WriteLine (); Task tarea1 = new Task( () => Tarea("Tarea No. 1", 3)); Task tarea2 = new Task( () => Tarea("Tarea No. 2", 2)); var tareaCompuesta = Task.WhenAll(tarea1, tarea2); // Continuación para la tarea compuesta: tareaCompuesta.ContinueWith( t => Console.WriteLine ("Primera respuesta {0}, segunda respuesta: {1}.", t.Result[0], t.Result[1])); // Inicio ejecución tareas: tarea1.Start(); tarea2.Start(); // Suspensión temporal: Thread.Sleep(TimeSpan.FromSeconds(4)); Console.WriteLine (); // Conjunto de tareas: var tareas = new List>(); // Creación conjunto de tareas: for (int i = 3; i < 6; ++i) { int contador = i; Task tarea = new Task( () => Tarea( String.Format("Tarea No. {0}", contador), contador)); tareas.Add(tarea); tarea.Start(); } // Mientras que hayan tareas por terminar: while (tareas.Count > 0) { // Obtiene cualquiera de las tareas que haya terminado: var tareaCompletada = Task.WhenAny(tareas).Result; // Elimina la tarea que ya terminó de la lista: tareas.Remove(tareaCompletada); // Muestra en la salida estándar el resultado de la tarea terminada: Console.WriteLine ("La tarea que acaba de terminar generó como resultado: {0}.", tareaCompletada.Result); } Console.WriteLine (); } public static int Tarea(string nombre, int duracion) { 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); // Simulación de ejecución tardía: Thread.Sleep (TimeSpan.FromSeconds(duracion)); return 42 * duracion; } } }