using System; using System.Threading; using System.Threading.Tasks; namespace Recetas.Multithreading.R0407 { public class GestionExcepcionesTarea { public static void Main() { Console.WriteLine (); // Creación y ejecución de tarea sincrónica: Task tarea1; // Gestión de la excepción producida por `tarea1`: try { tarea1 = Task.Run( () => Tarea("Tarea No. 1", 2)); int resultado = tarea1.Result; Console.WriteLine ("Resultado de Tarea No. 1: {0}.", resultado); } catch (Exception ex) { Console.WriteLine ("Excepción producida en Tarea No. 1: {0}.", ex); } Console.WriteLine ("------------------------------------------------"); Console.WriteLine (); Task tarea2 = new Task(() => Tarea("Tarea No. 2", 3)); Task tarea3 = new Task(() => Tarea("Tarea No. 4", 2)); // Tarea compuesta: Task tareaCompuesta = Task.WhenAll (tarea2, tarea3); tareaCompuesta.ContinueWith (t => Console.WriteLine ("Excepción de `tareaCompuesta`: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted); // Inicio de la ejecución de `tarea2` y `tarea3`: tarea2.Start(); tarea3.Start(); // A espera de la finalización de la ejecución de las tareas: Thread.Sleep (TimeSpan.FromSeconds(5)); } public static int Tarea(string nombre, int duracion) { Console.WriteLine("La tarea `{0}` se está ejecutando en el ID de Thread {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)); // Lanzamiento de excepción: throw new Exception("¡Boom!"); return 42 * duracion; } } }