// OrtizOL - xCSw - http://o...content-available-to-author-only...t.com using System; using System.Threading; namespace Receta.Multithreading.R0302 { public class OperacionAsincronicaEnPoolThreads { public static void Main() { Console.WriteLine(Environment.NewLine); // Variables auxiliares: const int x = 11; const int y = 3; const string estado = "Estado 3 (closure)"; // Pasa implícitamente un objeto WaitCallback: ThreadPool.QueueUserWorkItem(OperacionAsincronica); // Esperada simulada en `Main`: Thread.Sleep(TimeSpan.FromSeconds(1)); // Uso de segunda versión sobrecargada de QueueUserWorkItem: ThreadPool.QueueUserWorkItem(OperacionAsincronica, "Estado 1 (estándar)"); // Esperada simulada en `Main`: Thread.Sleep(TimeSpan.FromSeconds(1)); // Uso de versión lambda para operación asincrónica: ThreadPool.QueueUserWorkItem( obj => { Console.WriteLine ("Estado operación: {0}", obj); Console.WriteLine ("ID thread de pool: {0}", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(TimeSpan.FromSeconds(2)); }, "Estado 2 (lambda)" ); // Versión closure: ThreadPool.QueueUserWorkItem( _ => { Console.WriteLine ("Estado operación: {0}, {1}", x + y, estado); Console.WriteLine ("ID thread de pool: {0}", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(TimeSpan.FromSeconds(2)); }); // Esperada simulada en `Main`: Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine(Environment.NewLine); } // Método de ejecución asincrónica: private static void OperacionAsincronica(Object estado) { Console.WriteLine ("Estado operación: {0}", estado ?? "(null)"); Console.WriteLine ("ID thread de pool: {0}", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(TimeSpan.FromSeconds(2)); } } }