Advertisement
Fhernd

ConversionAPMaTPL.cs

Jun 2nd, 2016
2,473
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.70 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Recetas.Multithreading.R0404
  6. {
  7.     public class ConversionAPMaTPL
  8.     {
  9.         public static void Main()
  10.         {
  11.             // Variables auxiliares:
  12.             int idThread;
  13.             TareaAsincronica ta = Prueba;
  14.             TareaAsincronicaIncompatible tai = Prueba;
  15.            
  16.             Console.WriteLine ("\nOpción 1:\n");
  17.            
  18.             // Tarea para el delegado TareaAsincronica:
  19.             Task<string> tarea = Task<string>.Factory.FromAsync(
  20.                 ta.BeginInvoke("ThreadTareaAsincronica", Callback, "Invocación asincrónica con delegado."),
  21.                 ta.EndInvoke
  22.             );
  23.            
  24.             // Continuar tarea:
  25.             tarea.ContinueWith(t => Console.WriteLine ("El callback ha terminado.\n\tEjecución de continuación.\n\t\tResultado: {0}",
  26.                 t.Result));
  27.            
  28.             // Mientras termina la tarea muestra su estado:
  29.             while (!tarea.IsCompleted)
  30.             {
  31.                 Console.WriteLine ("Estado de la tarea: {0}", tarea.Status);
  32.                 Thread.Sleep (TimeSpan.FromSeconds(0.5));
  33.             }
  34.            
  35.             // El último estado de la tarea:
  36.             Console.WriteLine ("Último estado tarea: {0}", tarea.Status);
  37.             Thread.Sleep(TimeSpan.FromSeconds(1));
  38.            
  39.            
  40.             Console.WriteLine ("----------------------------------------");
  41.             Console.WriteLine ();
  42.             Console.WriteLine ("Opción 2:\n");
  43.            
  44.             // Variante de la opción 1:
  45.             tarea = Task<string>.Factory.FromAsync(
  46.                 ta.BeginInvoke, ta.EndInvoke, "ThreadTareaAsincronica", "Invocación asincrónica con delegado."
  47.             );
  48.            
  49.             // Continuación tarea:
  50.             tarea.ContinueWith(t => Console.WriteLine ("Tarea completada.\n\tEjecución de continuación.\n\tResultado: {0}",
  51.                 t.Result));
  52.                
  53.             // Mientras termina la tarea muestra su estado:
  54.             while (!tarea.IsCompleted)
  55.             {
  56.                 Console.WriteLine ("Estado de la tarea: {0}", tarea.Status);
  57.                 Thread.Sleep(TimeSpan.FromSeconds(0.5));
  58.             }
  59.            
  60.             // El último estado de la tarea:
  61.             Console.WriteLine ("Último estado tarea: {0}", tarea.Status);
  62.             Thread.Sleep(TimeSpan.FromSeconds(1));
  63.            
  64.            
  65.             Console.WriteLine ("------------------------------------------");
  66.             Console.WriteLine ();
  67.             Console.WriteLine ("Opción 3:\n");
  68.            
  69.             // Envoltura del callback:
  70.             IAsyncResult ar = tai.BeginInvoke(out idThread, Callback, "Invocación asincrónica de delegado.");
  71.            
  72.             tarea = Task<string>.Factory.FromAsync(ar, _ => tai.EndInvoke(out idThread, ar));
  73.            
  74.             // Continuación tarea:
  75.             tarea.ContinueWith( t =>
  76.                 Console.WriteLine("Tarea completada.\n\tEjecución de continuación.\n\tResultado: {0}\n\tID Thread: {1}",
  77.                     t.Result, idThread));
  78.                    
  79.             // Mientras termina la tarea muestra su estado:
  80.             while (!tarea.IsCompleted)
  81.             {
  82.                 Console.WriteLine ("Estado de la tarea: {0}", tarea.Status);
  83.                 Thread.Sleep(TimeSpan.FromSeconds(0.5));
  84.             }
  85.            
  86.             Console.WriteLine ();
  87.             Console.WriteLine ("Último estado tarea: {0}", tarea.Status);
  88.            
  89.             Thread.Sleep(TimeSpan.FromSeconds(1));
  90.            
  91.             Console.WriteLine ();
  92.         }
  93.  
  94.         // Delegado con firma directamente compatible con TPL:
  95.         private delegate string TareaAsincronica(string nombreThread);
  96.        
  97.         // Delegado con firma no compatible con TPL:
  98.         private delegate string TareaAsincronicaIncompatible(out int idThread);
  99.        
  100.         // Callback para respuesta a llamadas asincrónicas:
  101.         private static void Callback(IAsyncResult ar)
  102.         {
  103.             Console.WriteLine ("Iniciando callback...");
  104.             Console.WriteLine ("Estado pasado al callback: {0}", ar.AsyncState);
  105.             Console.WriteLine ("¿Thread del pool de threads?: {0}",
  106.                 Thread.CurrentThread.IsThreadPoolThread);
  107.             Console.WriteLine ("ID del thread: {0}", Thread.CurrentThread.ManagedThreadId);
  108.         }
  109.        
  110.         // Método para ejecución asincrónica:
  111.         private static string Prueba(string nombreThread)
  112.         {
  113.             Console.WriteLine ("Iniciando prueba...");
  114.             Console.WriteLine ("¿Thread del pool de threads?: {0}",
  115.                 Thread.CurrentThread.IsThreadPoolThread);
  116.            
  117.             // Espera simulada:
  118.             Thread.Sleep(TimeSpan.FromSeconds(2));
  119.            
  120.             Thread.CurrentThread.Name = nombreThread;
  121.  
  122.             // Resultado:
  123.             return String.Format("-Nombre thread: {0}-", Thread.CurrentThread.Name);
  124.         }
  125.        
  126.         // Método para ejecución asincrónica:
  127.         private static string Prueba(out int idThread)
  128.         {
  129.             Console.WriteLine ("Iniciando prueba...");
  130.             Console.WriteLine ("¿Thread del pool de threads?: {0}",
  131.                 Thread.CurrentThread.IsThreadPoolThread);
  132.                
  133.             // Simulación de espera:
  134.             Thread.Sleep(TimeSpan.FromSeconds(2));
  135.            
  136.             idThread = Thread.CurrentThread.ManagedThreadId;
  137.            
  138.             // Resultado:
  139.             return String.Format("-ID del thread del pool de threads: {0}-", idThread);
  140.         }
  141.     }
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement