Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.Cap04
  5. {
  6.     // Clase que contiene información útil para el
  7.     // método invocado por el delegado WaitOrTimerCallback:
  8.     public class InformacionTarea
  9.     {
  10.         public RegisteredWaitHandle Handle = null;
  11.         public string Mensaje = "valor";
  12.     }
  13.    
  14.     public class UsoWaitOrTimerCallback
  15.     {
  16.         public static void Main()
  17.         {
  18.             // El tread Main usa instancia de AutoResetEvent para señalizar
  19.             // el manejador de espera registrado. Este se encarga
  20.             // de invocar al método callback:
  21.             AutoResetEvent are = new AutoResetEvent (false);
  22.            
  23.             InformacionTarea it = new InformacionTarea();
  24.             it.Mensaje = "Primera tarea";
  25.            
  26.             // El campo Handle de InformacionTarea contiene de la instancia
  27.             // RegistredWaitHandle generada por el método
  28.             // RegisterWaitForSingleObject:
  29.             it.Handle = ThreadPool.RegisterWaitForSingleObject (
  30.                 are,
  31.                 new WaitOrTimerCallback (ProcesoEspera),
  32.                 it,
  33.                 1000,
  34.                 false
  35.             );
  36.            
  37.             // Se realiza una espera de hasta 3 segundos en el thread main
  38.             // para demostrar la superación del tiempo de espera; luego
  39.             // la generación de la señal:
  40.             Thread.Sleep (3000);
  41.             Console.WriteLine ("El thread main genera la señal.");
  42.             are.Set ();
  43.            
  44.             // El thread main se suspende, para dar un tiemp de espera adicional
  45.             // y que el programa no finalice sin completar todas las tareas:
  46.             Thread.Sleep (1000);
  47.         }
  48.        
  49.         // Método callback para el delegado WaitOrTimerCallback. Este
  50.         // método se ejecuta cuando se agota el tiempo de espera o
  51.         // la instancia de tipo WaitHandle (AutoResetEvent) ha generado
  52.         // una señal:
  53.         public static void ProcesoEspera (object estado, bool tiempoAgotado)
  54.         {
  55.             // Conversión explícita al objeto InformacionTarea:
  56.             InformacionTarea it = (InformacionTarea) estado;
  57.            
  58.             string causa = "TIEMPO AGOTADO";
  59.            
  60.             if ( !tiempoAgotado )
  61.             {
  62.                 causa = "SEÑALADO";
  63.                
  64.                 // Cuando la instancia WaitHandle es señalizada, se
  65.                 // detiene cualquier ejecución futura del método
  66.                 // callback:
  67.                 if (it.Handle != null)
  68.                 {
  69.                     it.Handle.Unregister (null);
  70.                 }
  71.             }
  72.            
  73.             // Resumen:
  74.             Console.WriteLine ("El método ProcesoEspera se ejecutó en el thread {0}. Causa = {1}",
  75.                                Thread.CurrentThread.GetHashCode().ToString(), causa);
  76.         }
  77.     }
  78. }