Advertisement
Fhernd

Programa.cs

Feb 24th, 2018
1,427
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.86 KB | None | 0 0
  1. using System;
  2. using System.Dynamic;
  3. using System.Runtime.CompilerServices;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using ImpromptuInterface;
  7.  
  8. namespace R5._9OperadorAwaitConDynamic
  9. {
  10.     class Programa
  11.     {
  12.         /// <summary>
  13.         /// Inicia la ejecución de la aplicación.
  14.         /// </summary>
  15.         static void Main()
  16.         {
  17.             Task nuevaTarea = ProcesamientoAsincronico();
  18.  
  19.             nuevaTarea.Wait();
  20.         }
  21.  
  22.         /// <summary>
  23.         /// Inicia el procesamiento asincrónica de una tarea.
  24.         /// </summary>
  25.         /// <returns>Tarea</returns>
  26.         async static Task ProcesamientoAsincronico()
  27.         {
  28.             string resultado = await ObtenerObjetoAwaitDinamico(true);
  29.             Console.WriteLine(resultado);
  30.  
  31.             resultado = await ObtenerObjetoAwaitDinamico(false);
  32.             Console.WriteLine(resultado);
  33.         }
  34.  
  35.         /// <summary>
  36.         /// Obtiene un objeto dinámico a partir de la ejecución sincrónica o asincrónica de una tarea que
  37.         /// a de completarse después un segundo.
  38.         /// </summary>
  39.         /// <param name="completarConSincronismo">Determina si la tarea se ejecuta sincrónica o asincrónicamente.</param>
  40.         /// <returns>Objeto dinámico</returns>
  41.         static dynamic ObtenerObjetoAwaitDinamico(bool completarConSincronismo)
  42.         {
  43.             dynamic resultado = new ExpandoObject();
  44.             dynamic awaiter = new ExpandoObject();
  45.             awaiter.Message = "Proceso completado sincrónicamente";
  46.             awaiter.IsCompleted = completarConSincronismo;
  47.             awaiter.GetResult = (Func<string>)(() => awaiter.Message);
  48.  
  49.             awaiter.OnCompleted = (Action<Action>)(callback =>
  50.                 ThreadPool.QueueUserWorkItem(state => {
  51.                     Thread.Sleep(TimeSpan.FromSeconds(1));
  52.                     awaiter.Message = ObtenerMensajes();
  53.  
  54.                     if (callback != null)
  55.                     {
  56.                         callback();
  57.                     }
  58.                 })
  59.             );
  60.  
  61.             IAwaiter<string> proxy = Impromptu.ActLike(awaiter);
  62.             resultado.GetAwaiter = (Func<dynamic>)(() => proxy);
  63.             return resultado;
  64.         }
  65.  
  66.         /// <summary>
  67.         /// Muestra la información actual del thread en ejecución.
  68.         /// </summary>
  69.         /// <returns>Información actual del thread en ejecución.</returns>
  70.         static string ObtenerMensajes()
  71.         {
  72.             return string.Format("La tarea se está ejecutando en el thread con ID: {0}. ¿Thread en el pool de threads?: {1} ", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
  73.         }
  74.  
  75.         public interface IAwaiter<T> : INotifyCompletion
  76.         {
  77.             bool IsCompleted { get; }
  78.             T GetResult();
  79.         }
  80.     }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement