fork download
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.Cap04
  5. {
  6. // Clase que verifica el estado de variables:
  7. internal class VerificadorEstado
  8. {
  9. private int contador;
  10. private int maximo;
  11.  
  12. public VerificadorEstado (int maximo)
  13. {
  14. this.maximo = maximo;
  15. contador = 0;
  16. }
  17.  
  18. // Este método será invocado indirectamente
  19. // por un delagdo TimerCallback:
  20. public void ComprobarEstado (Object infoEstado)
  21. {
  22. AutoResetEvent autoEvent = (AutoResetEvent) infoEstado;
  23.  
  24. Console.WriteLine ("Estado: {0} - Comprobación a las {1,2}.", (++contador).ToString(), DateTime.Now.ToString("h:mm:ss.fff"));
  25.  
  26. // Si el contador alcanzó el límite establecido por `maximo`, entonces
  27. // se reinicia el contador, y genera señal de completado a los
  28. // threads que se hayan en espera y para que puedan proceder:
  29. if (contador == maximo)
  30. {
  31. contador = 0;
  32. autoEvent.Set();
  33. }
  34. }
  35. }
  36.  
  37. // Clase con código cliente:
  38. internal sealed class UsoTimerCallbackTimer
  39. {
  40. public static void Main()
  41. {
  42. // Controlador de espera:
  43. // Con false se indica que no debe notificarse una vez se inicialice:
  44. AutoResetEvent autoEvent = new AutoResetEvent(false);
  45.  
  46. // Instancia de VerificadorEstado:
  47. VerificadorEstado ve = new VerificadorEstado(10);
  48.  
  49. // Encapsula método ComprobarEstado de la instancia ve (VerificadorEstado):
  50. TimerCallback tcb = new TimerCallback (ve.ComprobarEstado);
  51.  
  52. // Creación de instancia Timer que señala al delegado (tcb) invocar
  53. // el método ComprobarEstado después de un segundo, y cada 0.25 segundos:
  54. Console.WriteLine ("\nCreación de temporizador (Timer) a las {0}.\n", DateTime.Now.ToString("h:mm:ss.fff"));
  55. Timer temporizador = new Timer (tcb, autoEvent, 1000, 250);
  56.  
  57. // Cuando se genere una señal por parte de AutoResetEvent, se cambia el
  58. // periodo de ejecución a medio segundo:
  59. autoEvent.WaitOne (5000, false);
  60. temporizador.Change (0, 500);
  61. Console.WriteLine ("\nCambiando intervalo de ejecución a 1/2 segundo\n");
  62.  
  63. // Cuando se general una señal por parte de AutoResetEvent, se
  64. // cancela el temporizador con el método Dispose:
  65. autoEvent.WaitOne (5000, false);
  66. temporizador.Dispose();
  67. Console.WriteLine ("\nSe ha cancelado el temporizador.\n");
  68. }
  69. }
  70. }
Success #stdin #stdout 0.09s 36440KB
stdin
Standard input is empty
stdout
Creación de temporizador (Timer) a las 11:54:10.070.

Estado: 1 - Comprobación a las 11:54:11.112.
Estado: 2 - Comprobación a las 11:54:11.360.
Estado: 3 - Comprobación a las 11:54:11.610.
Estado: 4 - Comprobación a las 11:54:11.860.
Estado: 5 - Comprobación a las 11:54:12.110.
Estado: 6 - Comprobación a las 11:54:12.360.
Estado: 7 - Comprobación a las 11:54:12.610.
Estado: 8 - Comprobación a las 11:54:12.860.
Estado: 9 - Comprobación a las 11:54:13.110.
Estado: 10 - Comprobación a las 11:54:13.361.

Cambiando intervalo de ejecución a 1/2 segundo

Estado: 1 - Comprobación a las 11:54:13.362.
Estado: 2 - Comprobación a las 11:54:13.861.
Estado: 3 - Comprobación a las 11:54:14.362.
Estado: 4 - Comprobación a las 11:54:14.862.
Estado: 5 - Comprobación a las 11:54:15.362.
Estado: 6 - Comprobación a las 11:54:15.862.
Estado: 7 - Comprobación a las 11:54:16.362.
Estado: 8 - Comprobación a las 11:54:16.862.
Estado: 9 - Comprobación a las 11:54:17.362.
Estado: 10 - Comprobación a las 11:54:17.862.

Se ha cancelado el temporizador.