Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Threading;
- namespace Recetas.Cap04
- {
- // Clase que contiene información útil para el
- // método invocado por el delegado WaitOrTimerCallback:
- public class InformacionTarea
- {
- public RegisteredWaitHandle Handle = null;
- public string Mensaje = "valor";
- }
- public class UsoWaitOrTimerCallback
- {
- public static void Main()
- {
- // El tread Main usa instancia de AutoResetEvent para señalizar
- // el manejador de espera registrado. Este se encarga
- // de invocar al método callback:
- AutoResetEvent are = new AutoResetEvent (false);
- InformacionTarea it = new InformacionTarea();
- it.Mensaje = "Primera tarea";
- // El campo Handle de InformacionTarea contiene de la instancia
- // RegistredWaitHandle generada por el método
- // RegisterWaitForSingleObject:
- it.Handle = ThreadPool.RegisterWaitForSingleObject (
- are,
- new WaitOrTimerCallback (ProcesoEspera),
- it,
- 1000,
- false
- );
- // Se realiza una espera de hasta 3 segundos en el thread main
- // para demostrar la superación del tiempo de espera; luego
- // la generación de la señal:
- Thread.Sleep (3000);
- Console.WriteLine ("El thread main genera la señal.");
- are.Set ();
- // El thread main se suspende, para dar un tiemp de espera adicional
- // y que el programa no finalice sin completar todas las tareas:
- Thread.Sleep (1000);
- }
- // Método callback para el delegado WaitOrTimerCallback. Este
- // método se ejecuta cuando se agota el tiempo de espera o
- // la instancia de tipo WaitHandle (AutoResetEvent) ha generado
- // una señal:
- public static void ProcesoEspera (object estado, bool tiempoAgotado)
- {
- // Conversión explícita al objeto InformacionTarea:
- InformacionTarea it = (InformacionTarea) estado;
- string causa = "TIEMPO AGOTADO";
- if ( !tiempoAgotado )
- {
- causa = "SEÑALADO";
- // Cuando la instancia WaitHandle es señalizada, se
- // detiene cualquier ejecución futura del método
- // callback:
- if (it.Handle != null)
- {
- it.Handle.Unregister (null);
- }
- }
- // Resumen:
- Console.WriteLine ("El método ProcesoEspera se ejecutó en el thread {0}. Causa = {1}",
- Thread.CurrentThread.GetHashCode().ToString(), causa);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement