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