using System; using System.Threading; using System.Threading.Tasks; namespace Recetas.Multithreading.R0404 { public class ConversionAPMaTPL { public static void Main() { // Variables auxiliares... int idThread; TareaAsincronica ta = Prueba; TareaAsincronicaIncompatible tai = Prueba; Console.WriteLine ("\nOpción 1:\n"); // Tarea para el delegado TareaAsincronica: Task tarea = Task.Factory.FromAsync( ta.BeginInvoke("ThreadTareaAsincronica", Callback, "Invocación asincrónica con delegado."), ta.EndInvoke ); // Continuar tarea: tarea.ContinueWith(t => Console.WriteLine ("El callback ha terminado.\n\tEjecución de continuación.\n\t\tResultado: {0}", t.Result)); // Mientras termina la tarea muestra su estado: while (!tarea.IsCompleted) { Console.WriteLine ("Estado de la tarea: {0}", tarea.Status); Thread.Sleep (TimeSpan.FromSeconds(0.5)); } // El último estado de la tarea: Console.WriteLine ("Último estado tarea: {0}", tarea.Status); Thread.Sleep(TimeSpan.FromSeconds(1)); Console.WriteLine ("----------------------------------------"); Console.WriteLine (); Console.WriteLine ("Opción 2:\n"); // Variante de la opción 1: tarea = Task.Factory.FromAsync( ta.BeginInvoke, ta.EndInvoke, "ThreadTareaAsincronica", "Invocación asincrónica con delegado." ); // Continuación tarea: tarea.ContinueWith(t => Console.WriteLine ("Tarea completada.\n\tEjecución de continuación.\n\tResultado: {0}", t.Result)); // Mientras termina la tarea muestra su estado: while (!tarea.IsCompleted) { Console.WriteLine ("Estado de la tarea: {0}", tarea.Status); Thread.Sleep(TimeSpan.FromSeconds(0.5)); } // El último estado de la tarea: Console.WriteLine ("Último estado tarea: {0}", tarea.Status); Thread.Sleep(TimeSpan.FromSeconds(1)); Console.WriteLine ("------------------------------------------"); Console.WriteLine (); Console.WriteLine ("Opción 3:\n"); // Envoltura del callback: IAsyncResult ar = tai.BeginInvoke(out idThread, Callback, "Invocación asincrónica de delegado."); tarea = Task.Factory.FromAsync(ar, _ => tai.EndInvoke(out idThread, ar)); // Continuación tarea: tarea.ContinueWith( t => Console.WriteLine("Tarea completada.\n\tEjecución de continuación.\n\tResultado: {0}\n\tID Thread: {1}", t.Result, idThread)); // Mientras termina la tarea muestra su estado: while (!tarea.IsCompleted) { Console.WriteLine ("Estado de la tarea: {0}", tarea.Status); Thread.Sleep(TimeSpan.FromSeconds(0.5)); } Console.WriteLine (); Console.WriteLine ("Último estado tarea: {0}", tarea.Status); Thread.Sleep(TimeSpan.FromSeconds(1)); Console.WriteLine (); } // Delegado con firma directamente compatible con TPL: private delegate string TareaAsincronica(string nombreThread); // Delegado con firma no compatible con TPL: private delegate string TareaAsincronicaIncompatible(out int idThread); // Callback para respuesta a llamadas asincrónicas: private static void Callback(IAsyncResult ar) { Console.WriteLine ("Iniciando callback..."); Console.WriteLine ("Estado pasado al callback: {0}", ar.AsyncState); Console.WriteLine ("¿Thread del pool de threads?: {0}", Thread.CurrentThread.IsThreadPoolThread); Console.WriteLine ("ID del thread: {0}", Thread.CurrentThread.ManagedThreadId); } // Método para ejecución asincrónica: private static string Prueba(string nombreThread) { Console.WriteLine ("Iniciando prueba..."); Console.WriteLine ("¿Thread del pool de threads?: {0}", Thread.CurrentThread.IsThreadPoolThread); // Espera simulada: Thread.Sleep(TimeSpan.FromSeconds(2)); Thread.CurrentThread.Name = nombreThread; // Resultado: return String.Format("-Nombre thread: {0}-", Thread.CurrentThread.Name); } // Método para ejecución asincrónica: private static string Prueba(out int idThread) { Console.WriteLine ("Iniciando prueba..."); Console.WriteLine ("¿Thread del pool de threads?: {0}", Thread.CurrentThread.IsThreadPoolThread); // Simulación de espera: Thread.Sleep(TimeSpan.FromSeconds(2)); idThread = Thread.CurrentThread.ManagedThreadId; // Resultado: return String.Format("-ID del thread del pool de threads: {0}-", idThread); } } }