// 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));
}
}
}