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<int> tarea1 = new Task<int>( () => Tarea("Tarea No. 1", 3));
Task<int> tarea2 = new Task<int>( () => 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<Task<int>>();
// Creación conjunto de tareas:
for (int i = 3; i < 6; ++i)
{
int contador = i;
Task<int> tarea = new Task<int>( () => 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;
}
}
}