Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.Cap04
  5. {
  6.     internal sealed class ManejadorSenializacion
  7.     {
  8.         public static void Main()
  9.         {
  10.             // Crea manejador del mecanismo de señalización:
  11.             AutoResetEvent are = new AutoResetEvent (false);
  12.            
  13.             // Crea mensaje a pasar al método ManejadorEventos
  14.             // cuando este se ejecute:
  15.             string info = "AutoResetEvent generó una señal.";
  16.            
  17.             // Registro del método ManejadorEventos a espera o
  18.             // una vez que AutoResetEvent emita una señal. El ciclo
  19.             // de tiempo es de 10 segundos. La operación de espera
  20.             // se realizará indefinidamente (false):
  21.             RegisteredWaitHandle manejador = ThreadPool.RegisterWaitForSingleObject (
  22.                 are,
  23.                 new WaitOrTimerCallback (ManejadorEventos),
  24.                 info,
  25.                 10000,
  26.                 false
  27.             );
  28.            
  29.             Console.WriteLine ("Presione Enter para activar la señal de AutoResetEvent" +
  30.                                "\no ingrese \"Cancelar\" para des-registrar la operación de espera.");
  31.            
  32.             while ( Console.ReadLine ().ToUpper() != "CANCELAR")
  33.             {
  34.                 // Mientras que el usuario no decida ingresar "Cancelar"
  35.                 // se activará una señal sobre AutoResetEvent; esto
  36.                 // hará que el método ManejadorEventos se ejecute; además,
  37.                 // de reestablecer para una próxima ejecución:
  38.                 are.Set();
  39.             }
  40.            
  41.             // Des-registra el manejador de señalización:
  42.             Console.WriteLine ("\n\nRemoviendo el manejador de señalización...");
  43.             manejador.Unregister (null);
  44.            
  45.             Console.WriteLine ("\nEl método Main ha finalizado. Presione Enter para finalizar.");
  46.             Console.ReadLine ();
  47.         }
  48.        
  49.         // Método que será ejecutado cada vez que una
  50.         // instancia de AutoResetEvent genere una señal o
  51.         // una cantidad de tiempo haya transcurrido:
  52.         private static void ManejadorEventos (object info, bool tiempoAgotado)
  53.         {
  54.             // El mensaje a mostrar depende si el objeto AutoResetEvent ha
  55.             // generado una señal o el tiempo especificado se ha agotado:
  56.             if (tiempoAgotado)
  57.             {
  58.                 Console.WriteLine ("El tiempo se agotó a las {0}.",
  59.                                    DateTime.Now.ToString ("HH:mm:ss:ffff"));
  60.             }
  61.             else
  62.             {
  63.                 Console.WriteLine ("Estado `{1}` a las {0}.",
  64.                                    DateTime.Now.ToString ("HH:mm:ss:ffff"), info);
  65.             }
  66.         }
  67.     }
  68. }