Created
June 15, 2014 11:19
-
-
Save Fhernd/94226deec34b5d80ac5b to your computer and use it in GitHub Desktop.
Demostración del uso del delegado System.Threading.TimerCallback y la clase System.Threadding.Timer en C#.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment