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<int> 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<int>(() => Tarea("Tarea No. 2", 3));
Task tarea3 = new Task<int>(() => 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;
}
}
}