fork download
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Recetas.Multithreading.R0407
  6. {
  7. public class GestionExcepcionesTarea
  8. {
  9. public static void Main()
  10. {
  11. Console.WriteLine ();
  12.  
  13. // Creación y ejecución de tarea sincrónica:
  14. Task<int> tarea1;
  15.  
  16. // Gestión de la excepción producida por `tarea1`:
  17. try
  18. {
  19. tarea1 = Task.Run( () => Tarea("Tarea No. 1", 2));
  20. int resultado = tarea1.Result;
  21. Console.WriteLine ("Resultado de Tarea No. 1: {0}.", resultado);
  22. }
  23. catch (Exception ex)
  24. {
  25. Console.WriteLine ("Excepción producida en Tarea No. 1: {0}.", ex);
  26. }
  27.  
  28. Console.WriteLine ("------------------------------------------------");
  29. Console.WriteLine ();
  30.  
  31. Task tarea2 = new Task<int>(() => Tarea("Tarea No. 2", 3));
  32. Task tarea3 = new Task<int>(() => Tarea("Tarea No. 4", 2));
  33.  
  34. // Tarea compuesta:
  35. Task tareaCompuesta = Task.WhenAll (tarea2, tarea3);
  36.  
  37. tareaCompuesta.ContinueWith (t =>
  38. Console.WriteLine ("Excepción de `tareaCompuesta`: {0}", t.Exception),
  39. TaskContinuationOptions.OnlyOnFaulted);
  40.  
  41. // Inicio de la ejecución de `tarea2` y `tarea3`:
  42. tarea2.Start();
  43. tarea3.Start();
  44.  
  45. // A espera de la finalización de la ejecución de las tareas:
  46. Thread.Sleep (TimeSpan.FromSeconds(5));
  47. }
  48.  
  49. public static int Tarea(string nombre, int duracion)
  50. {
  51. Console.WriteLine("La tarea `{0}` se está ejecutando en el ID de Thread {1}. "
  52. + "¿Thread en pool de threads?: {2}", nombre,
  53. Thread.CurrentThread.ManagedThreadId,
  54. Thread.CurrentThread.IsThreadPoolThread);
  55.  
  56. // Simulación de ejecución tardía:
  57. Thread.Sleep (TimeSpan.FromSeconds(duracion));
  58.  
  59. // Lanzamiento de excepción:
  60. throw new Exception("¡Boom!");
  61.  
  62. return 42 * duracion;
  63. }
  64. }
  65. }
Success #stdin #stdout 0.08s 31432KB
stdin
Standard input is empty
stdout
La tarea `Tarea No. 1` se está ejecutando en el ID de Thread 4. ¿Thread en pool de threads?: True
Excepción producida en Tarea No. 1: System.AggregateException: One or more errors occurred. ---> System.Exception: ¡Boom!
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.Tarea (System.String nombre, Int32 duracion) [0x00000] in <filename unknown>:0 
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.<Main>m__0 () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task`1[System.Int32].InnerInvoke () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task.Execute () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Threading.Tasks.Task.ThrowIfExceptional (Boolean includeTaskCanceledExceptions) [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task`1[System.Int32].GetResultCore (Boolean waitCompletionNotification) [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task`1[System.Int32].get_Result () [0x00000] in <filename unknown>:0 
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.Main () [0x00000] in <filename unknown>:0 
---> (Inner Exception #0) System.Exception: ¡Boom!
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.Tarea (System.String nombre, Int32 duracion) [0x00000] in <filename unknown>:0 
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.<Main>m__0 () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task`1[System.Int32].InnerInvoke () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task.Execute () [0x00000] in <filename unknown>:0 <---
.
------------------------------------------------

La tarea `Tarea No. 2` se está ejecutando en el ID de Thread 5. ¿Thread en pool de threads?: True
La tarea `Tarea No. 4` se está ejecutando en el ID de Thread 4. ¿Thread en pool de threads?: True
Excepción de `tareaCompuesta`: System.AggregateException: One or more errors occurred. ---> System.Exception: ¡Boom!
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.Tarea (System.String nombre, Int32 duracion) [0x00000] in <filename unknown>:0 
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.<Main>m__1 () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task`1[System.Int32].InnerInvoke () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task.Execute () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
---> (Inner Exception #0) System.Exception: ¡Boom!
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.Tarea (System.String nombre, Int32 duracion) [0x00000] in <filename unknown>:0 
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.<Main>m__1 () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task`1[System.Int32].InnerInvoke () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task.Execute () [0x00000] in <filename unknown>:0 <---

---> (Inner Exception #1) System.Exception: ¡Boom!
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.Tarea (System.String nombre, Int32 duracion) [0x00000] in <filename unknown>:0 
  at Recetas.Multithreading.R0407.GestionExcepcionesTarea.<Main>m__2 () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task`1[System.Int32].InnerInvoke () [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task.Execute () [0x00000] in <filename unknown>:0 <---