fork download
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Ch05_UsingCSharp5Dot0.R0501
  6. {
  7. /// <summary>
  8. /// Clase para demostración de ejecución con TPL y await.
  9. /// </summary>
  10. public class TplVsAwait
  11. {
  12. /// <summary>
  13. /// Ejecuta las demostraciones de ejecuciones con TPL y await.
  14. /// </summary>
  15. public void Ejecutar()
  16. {
  17. Console.WriteLine();
  18. Task t = AsincronismoConTpl();
  19. t.Wait();
  20.  
  21. Console.WriteLine();
  22.  
  23. t = AsincronismoConAwait();
  24. t.Wait();
  25. }
  26.  
  27. /// <summary>
  28. /// Demuestra el uso de TPL para llamada asincrónica.
  29. /// </summary>
  30. /// <returns></returns>
  31. private Task AsincronismoConTpl()
  32. {
  33. Task<string> tarea = ObtenerInfoAsincro("Tarea No. 1");
  34.  
  35. Task tarea2 = tarea.ContinueWith(t => Console.WriteLine(t.Result),
  36. TaskContinuationOptions.NotOnFaulted);
  37. Task tarea3 = tarea.ContinueWith(t => Console.WriteLine(
  38. t.Exception.InnerException), TaskContinuationOptions.OnlyOnFaulted);
  39.  
  40. return Task.WhenAny(tarea2, tarea3);
  41. }
  42.  
  43. /// <summary>
  44. /// Demuestra el uso del operador await para llamada asincrónica.
  45. /// </summary>
  46. /// <returns>Objeto Task con información de la tarea ejecutada.</returns>
  47. private async Task AsincronismoConAwait()
  48. {
  49. try
  50. {
  51. string resultado = await ObtenerInfoAsincro("Tarea No. 2");
  52. Console.WriteLine(resultado);
  53. }
  54. catch (Exception ex)
  55. {
  56. Console.WriteLine(ex);
  57. }
  58. }
  59.  
  60. /// <summary>
  61. /// Método asincrónico para demostrar la invocación desde TPL y await.
  62. /// </summary>
  63. /// <param name="nombre">Nombre de la tarea.</param>
  64. /// <returns>Información del thread del pool de threads.</returns>
  65. private async Task<string> ObtenerInfoAsincro(string nombre)
  66. {
  67. await Task.Delay(TimeSpan.FromSeconds(2));
  68.  
  69. return String.Format("`{0}` se está ejecutando en el ID de thread {1}. "
  70. + "¿Thread en el pool de threads?: {2}.",
  71. nombre,
  72. Thread.CurrentThread.ManagedThreadId,
  73. Thread.CurrentThread.IsThreadPoolThread);
  74. }
  75.  
  76. public static void Main()
  77. {
  78. new TplVsAwait().Ejecutar();
  79. }
  80. }
  81. }
Success #stdin #stdout 0.1s 29552KB
stdin
Standard input is empty
stdout

`Tarea No. 1` se está ejecutando en el ID de thread 5. ¿Thread en el pool de threads?: True.
`Tarea No. 2` se está ejecutando en el ID de thread 5. ¿Thread en el pool de threads?: True.