using System; using System.Threading; namespace Recetas.Cap04 { // Clase que verifica el estado de variables: internal class VerificadorEstado { private int contador; private int maximo; public VerificadorEstado (int maximo) { this.maximo = maximo; contador = 0; } // Este método será invocado indirectamente // por un delagdo TimerCallback: public void ComprobarEstado (Object infoEstado) { AutoResetEvent autoEvent = (AutoResetEvent) infoEstado; Console.WriteLine ("Estado: {0} - Comprobación a las {1,2}.", (++contador).ToString(), DateTime.Now.ToString("h:mm:ss.fff")); // Si el contador alcanzó el límite establecido por `maximo`, entonces // se reinicia el contador, y genera señal de completado a los // threads que se hayan en espera y para que puedan proceder: if (contador == maximo) { contador = 0; autoEvent.Set(); } } } // Clase con código cliente: internal sealed class UsoTimerCallbackTimer { public static void Main() { // Controlador de espera: // Con false se indica que no debe notificarse una vez se inicialice: AutoResetEvent autoEvent = new AutoResetEvent(false); // Instancia de VerificadorEstado: VerificadorEstado ve = new VerificadorEstado(10); // Encapsula método ComprobarEstado de la instancia ve (VerificadorEstado): TimerCallback tcb = new TimerCallback (ve.ComprobarEstado); // Creación de instancia Timer que señala al delegado (tcb) invocar // el método ComprobarEstado después de un segundo, y cada 0.25 segundos: Console.WriteLine ("\nCreación de temporizador (Timer) a las {0}.\n", DateTime.Now.ToString("h:mm:ss.fff")); Timer temporizador = new Timer (tcb, autoEvent, 1000, 250); // Cuando se genere una señal por parte de AutoResetEvent, se cambia el // periodo de ejecución a medio segundo: autoEvent.WaitOne (5000, false); temporizador.Change (0, 500); Console.WriteLine ("\nCambiando intervalo de ejecución a 1/2 segundo\n"); // Cuando se general una señal por parte de AutoResetEvent, se // cancela el temporizador con el método Dispose: autoEvent.WaitOne (5000, false); temporizador.Dispose(); Console.WriteLine ("\nSe ha cancelado el temporizador.\n"); } } }