using System;
using System.Threading;
using System.Threading.Tasks;
namespace Recetas.Multithreading.R0402
{
public class SincronismoAsincronismo
{
public static void Main()
{
// Ejecución sincrónica del método OperacionTask:
OperacionTask("Task desde el Thread de Main");
// Creación de Task asincrónico:
Task<int> taskAsincronico = CrearTask("Task 1");
taskAsincronico.Start();
int resultado = taskAsincronico.Result;
Console.WriteLine ("El resultado devuelto por Task 1 es: {0}", resultado);
// Creación nuevo Task para ejecución sincrónica:
Task<int> taskSincronico = CrearTask("Task 2");
taskSincronico.RunSynchronously();
resultado = taskSincronico.Result;
Console.WriteLine ("El resultado devuelto por Task 2 es: {0}", resultado);
// Creación de nueva tarea asincrónica:
taskAsincronico = CrearTask("Task 3");
taskAsincronico.Start();
// Mientras que la tarea no se haya completada,
// mostrar su estado:
while (!taskAsincronico.IsCompleted)
{
Console.WriteLine (taskAsincronico.Status);
Thread.Sleep (TimeSpan.FromSeconds(0.5));
}
// Muestra los estados finales de la ejecución
// de la última tarea asincrónica:
Console.WriteLine ("Estado de Task 3: {0}", taskAsincronico.Status);
resultado = taskAsincronico.Result;
Console.WriteLine ("El resultado devuelto por Task 3 es: {0}", resultado);
Console.WriteLine ();
}
public static Task<int> CrearTask(string nombreTask)
{
return new Task<int>( () => OperacionTask(nombreTask));
}
static int OperacionTask(string nombreTask)
{
Console.WriteLine ("\nID {0} se está ejecutando en el ID de Thread {1}. ¿Está en el pool de threads?: {2}",
nombreTask,
Thread.CurrentThread.ManagedThreadId,
Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep (TimeSpan.FromSeconds(2));
return 42;
}
}
}