Advertisement
Fhernd

TareasAsincronicasConsecutivas.cs

Jun 27th, 2016
1,569
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.91 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Ch05_UsingCSharp5Dot0.R0503
  6. {
  7.     public class TareasAsincronicasConsecutivas
  8.     {
  9.         /// <summary>
  10.         /// Ejecución de la demostración de TPL vs operador asincrónica.
  11.         /// </summary>
  12.         public void Ejecutar()
  13.         {
  14.             Task t = AsincronismoConTpl();
  15.             t.Wait();
  16.  
  17.             t = AsincronismoConAwait();
  18.             t.Wait();
  19.         }
  20.  
  21.         /// <summary>
  22.         /// Implementación para la demostración del flujo de control de invocaciones
  23.         /// a través de elementos de programa de TPL.
  24.         /// </summary>
  25.         /// <returns>Resultado de la operación asincrónica.</returns>
  26.         private Task AsincronismoConTpl()
  27.         {
  28.             var tareaCompuesta = new Task(() =>
  29.             {
  30.                 Task<string> tarea1 = ObtenerInfoThreadAsync("TPL No. 1");
  31.                 tarea1.ContinueWith(tarea =>
  32.                 {
  33.                     Console.WriteLine(tarea1.Result);
  34.  
  35.                     Task<string> tarea2 = ObtenerInfoThreadAsync("TPL No. 2");
  36.                     tarea2.ContinueWith(tareaAnidada =>
  37.                         Console.WriteLine(tareaAnidada.Result),
  38.                         TaskContinuationOptions.NotOnFaulted |
  39.                             TaskContinuationOptions.AttachedToParent);
  40.  
  41.                     tarea2.ContinueWith(tareaAnidada =>
  42.                         Console.WriteLine(tareaAnidada.Exception.InnerException),
  43.                         TaskContinuationOptions.OnlyOnFaulted |
  44.                             TaskContinuationOptions.AttachedToParent);
  45.                 },
  46.                     TaskContinuationOptions.NotOnFaulted |
  47.                         TaskContinuationOptions.AttachedToParent);
  48.  
  49.                 tarea1.ContinueWith(tarea =>
  50.                     Console.WriteLine(tarea1.Exception.InnerException),
  51.                     TaskContinuationOptions.OnlyOnFaulted |
  52.                         TaskContinuationOptions.AttachedToParent);
  53.             });
  54.  
  55.             tareaCompuesta.Start();
  56.  
  57.             return tareaCompuesta;
  58.         }
  59.  
  60.         /// <summary>
  61.         /// Implementación para demostración del flujo de control de invocaciones
  62.         /// con el operador asincrónico await.
  63.         /// </summary>
  64.         /// <returns>Resultado de la operación asincrónica.</returns>
  65.         private async Task AsincronismoConAwait()
  66.         {
  67.             try
  68.             {
  69.                 string resultado = await ObtenerInfoThreadAsync("Async No. 1");
  70.                 Console.WriteLine(resultado);
  71.                 resultado = await ObtenerInfoThreadAsync("Async No. 2");
  72.                 Console.WriteLine(resultado);
  73.             }
  74.             catch (Exception ex)
  75.             {
  76.                 Console.WriteLine(ex);
  77.             }
  78.         }
  79.  
  80.         /// <summary>
  81.         /// Operación para ejecución asincrónica desde implementación con TPL y
  82.         /// uso del operador asincrónico await.
  83.         /// </summary>
  84.         /// <param name="nombre">Nombre del mecanismo de invocación asincrónico.</param>
  85.         /// <returns>Resultado de operación asincrónica.</returns>
  86.         private async Task<String> ObtenerInfoThreadAsync(string nombre)
  87.         {
  88.             Console.WriteLine("Tarea `{0}` se ha iniciado.", nombre);
  89.  
  90.             /// Simula la ejecución de una operación de duración extendida:
  91.             await Task.Delay(TimeSpan.FromSeconds(2));
  92.  
  93.             if (nombre == "TPL No. 2")
  94.             {
  95.                 throw new Exception("¡Algo salió mal!");
  96.             }
  97.  
  98.             return String.Format("Tarea `{0}` se está ejecutando en el ID de thread {1}. "
  99.                     + "¿Thread en el pool de threads?: {2}",
  100.                 nombre,
  101.                 Thread.CurrentThread.ManagedThreadId,
  102.                 Thread.CurrentThread.IsThreadPoolThread);
  103.         }
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement