Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. // OrtizOL - xCSw - http://ortizol.blogspot.com
  2.  
  3. using System;
  4. using System.Threading;
  5.  
  6. namespace Receta.Multithreading.R0302
  7. {
  8.     public class OperacionAsincronicaEnPoolThreads
  9.     {
  10.         public static void Main()
  11.         {
  12.             Console.WriteLine(Environment.NewLine);
  13.            
  14.             // Variables auxiliares:
  15.             const int x = 11;
  16.             const int y = 3;
  17.             const string estado = "Estado 3 (closure)";
  18.            
  19.             // Pasa implícitamente un objeto WaitCallback:
  20.             ThreadPool.QueueUserWorkItem(OperacionAsincronica);
  21.            
  22.             // Esperada simulada en `Main`:
  23.             Thread.Sleep(TimeSpan.FromSeconds(1));
  24.            
  25.             // Uso de segunda versión sobrecargada de QueueUserWorkItem:
  26.             ThreadPool.QueueUserWorkItem(OperacionAsincronica, "Estado 1 (estándar)");
  27.            
  28.             // Esperada simulada en `Main`:
  29.             Thread.Sleep(TimeSpan.FromSeconds(1));
  30.            
  31.             // Uso de versión lambda para operación asincrónica:
  32.             ThreadPool.QueueUserWorkItem( obj => {
  33.                 Console.WriteLine ("Estado operación: {0}", obj);
  34.                 Console.WriteLine ("ID thread de pool: {0}", Thread.CurrentThread.ManagedThreadId);
  35.            
  36.                 Thread.Sleep(TimeSpan.FromSeconds(2));
  37.             }, "Estado 2 (lambda)" );
  38.            
  39.             // Versión closure:
  40.             ThreadPool.QueueUserWorkItem( _ => {
  41.                 Console.WriteLine ("Estado operación: {0}, {1}", x + y, estado);
  42.                 Console.WriteLine ("ID thread de pool: {0}", Thread.CurrentThread.ManagedThreadId);
  43.                
  44.                 Thread.Sleep(TimeSpan.FromSeconds(2));
  45.             });
  46.            
  47.             // Esperada simulada en `Main`:
  48.             Thread.Sleep(TimeSpan.FromSeconds(2));
  49.            
  50.             Console.WriteLine(Environment.NewLine);
  51.         }
  52.        
  53.         // Método de ejecución asincrónica:
  54.         private static void OperacionAsincronica(Object estado)
  55.         {
  56.             Console.WriteLine ("Estado operación: {0}", estado ?? "(null)");
  57.             Console.WriteLine ("ID thread de pool: {0}", Thread.CurrentThread.ManagedThreadId);
  58.            
  59.             Thread.Sleep(TimeSpan.FromSeconds(2));
  60.         }
  61.     }
  62. }