using System;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
namespace Recetas.Multithreading.R0405
{
public class ConversionEAPaTPL
{
public static void Main()
{
Console.WriteLine ();
var tcs = new TaskCompletionSource<int>();
var worker = new BackgroundWorker();
// Ocurre una vez que se invoca el método `RunWorkerAsync`:
worker.DoWork += (sender, eventArgs) =>
{
// Invocación asincrónica de `Tarea`:
eventArgs.Result = Tarea("Ejecución con worker", 5);
};
worker.RunWorkerCompleted += (sender, eventArgs) =>
{
// Se comprueba la finalización del thread creado por
// BackgroundWorker:
if (eventArgs.Error != null)
{
tcs.SetException(eventArgs.Error);
}
else if (eventArgs.Cancelled)
{
tcs.SetCanceled();
}
else
{
tcs.SetResult((int)eventArgs.Result);
}
};
// Inicia la ejecución asincrónica del método `Tarea`:
worker.RunWorkerAsync();
// Recupera el resultado obtenido por la ejecución asincrónica de `Tarea`:
int resultado = tcs.Task.Result;
Console.WriteLine ("Resultado de la operación asincrónica: {0}.\n", resultado);
}
// Proceso de ejecución asincrónica:
public static int Tarea(string nombre, int duracion)
{
Console.WriteLine ("La tarea `{0}` se está ejecutando en el ID {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;
}
}
}