using System; using System.Threading; using System.Threading.Tasks; namespace Ch05_UsingCSharp5Dot0.R0501 { /// /// Clase para demostración de ejecución con TPL y await. /// public class TplVsAwait { /// /// Ejecuta las demostraciones de ejecuciones con TPL y await. /// public void Ejecutar() { Console.WriteLine(); Task t = AsincronismoConTpl(); t.Wait(); Console.WriteLine(); t = AsincronismoConAwait(); t.Wait(); } /// /// Demuestra el uso de TPL para llamada asincrónica. /// /// private Task AsincronismoConTpl() { Task tarea = ObtenerInfoAsincro("Tarea No. 1"); Task tarea2 = tarea.ContinueWith(t => Console.WriteLine(t.Result), TaskContinuationOptions.NotOnFaulted); Task tarea3 = tarea.ContinueWith(t => Console.WriteLine( t.Exception.InnerException), TaskContinuationOptions.OnlyOnFaulted); return Task.WhenAny(tarea2, tarea3); } /// /// Demuestra el uso del operador await para llamada asincrónica. /// /// Objeto Task con información de la tarea ejecutada. private async Task AsincronismoConAwait() { try { string resultado = await ObtenerInfoAsincro("Tarea No. 2"); Console.WriteLine(resultado); } catch (Exception ex) { Console.WriteLine(ex); } } /// /// Método asincrónico para demostrar la invocación desde TPL y await. /// /// Nombre de la tarea. /// Información del thread del pool de threads. private async Task ObtenerInfoAsincro(string nombre) { await Task.Delay(TimeSpan.FromSeconds(2)); return String.Format("`{0}` se está ejecutando en el ID de thread {1}. " + "¿Thread en el pool de threads?: {2}.", nombre, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); } public static void Main() { new TplVsAwait().Ejecutar(); } } }