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(); 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; } } }