TimerWrapper.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #region --------------- Copyright Dresser Wayne Pignone -------------
  2. /*
  3. * $Log: /Wrk/WayneLibraries/Wrk/StateEngine/TimerWrapper.cs $
  4. *
  5. * 1 08-03-18 11:07 roger.månsson
  6. * Created.
  7. */
  8. #endregion
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Text;
  12. using System.Threading;
  13. namespace Wayne.Lib.StateEngine
  14. {
  15. /// <summary>
  16. /// Wraps a System.Threading.Timer together with an optional state engine timer. It is used
  17. /// to make it possible to reuse the Timer object, since it is quite expensive to create and
  18. /// destroy timers all the time. Now we only change the intervals on the timers, and disable them
  19. /// when they should not be active anymore.
  20. /// </summary>
  21. class TimerWrapper : IDisposable
  22. {
  23. private readonly TimerCallback timerCallback;
  24. #region Fields
  25. private bool disposed = false;
  26. StateEngine.Timer stateEngineTimer;
  27. System.Threading.Timer realTimer;
  28. #endregion
  29. #region Construction
  30. /// <summary>
  31. /// Initializes a new instance of the TimerWrapper class.
  32. /// </summary>
  33. /// <param name="timerCallback">Delegate that should be invoked when timer fires.</param>
  34. public TimerWrapper(TimerCallback timerCallback)
  35. {
  36. this.timerCallback = timerCallback;
  37. realTimer = new System.Threading.Timer(timerCallback, this, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
  38. }
  39. /// <summary>
  40. /// Finalizer
  41. /// </summary>
  42. ~TimerWrapper()
  43. {
  44. Dispose(false);
  45. }
  46. #endregion
  47. #region Properties
  48. /// <summary>
  49. /// Gets or sets the State Engine timer.
  50. /// </summary>
  51. public StateEngine.Timer StateEngineTimer
  52. {
  53. get { return stateEngineTimer; }
  54. set { stateEngineTimer = value; }
  55. }
  56. #endregion
  57. #region Methods
  58. /// <summary>
  59. /// Disables the underlying timer.
  60. /// </summary>
  61. internal void Disable()
  62. {
  63. if(!disposed)
  64. realTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
  65. }
  66. /// <summary>
  67. /// Enables the underlying timer.
  68. /// </summary>
  69. internal void Enable()
  70. {
  71. if (stateEngineTimer == null)
  72. throw new InvalidOperationException("Can not enable timer when no StateEngine timer is connected.");
  73. if (stateEngineTimer.IsPeriodic)
  74. realTimer.Change(stateEngineTimer.Interval, stateEngineTimer.Interval);
  75. else
  76. realTimer.Change(stateEngineTimer.Interval, System.Threading.Timeout.Infinite);
  77. }
  78. /// <summary>
  79. /// Fires the timer wrapper immediately.
  80. /// </summary>
  81. public void Fire()
  82. {
  83. if (timerCallback != null)
  84. timerCallback(this);
  85. }
  86. #endregion
  87. #region IDisposable Members
  88. /// <summary>
  89. /// Disposes the unmanaged resources
  90. /// </summary>
  91. /// <param name="disposing"></param>
  92. protected virtual void Dispose(bool disposing)
  93. {
  94. if (!disposed)
  95. {
  96. if (disposing)
  97. {
  98. if (realTimer != null)
  99. {
  100. realTimer.Dispose();
  101. }
  102. realTimer = null;
  103. }
  104. if (realTimer != null)
  105. {
  106. realTimer.Dispose();
  107. }
  108. realTimer = null;
  109. }
  110. disposed = true;
  111. }
  112. /// <summary>
  113. /// Disposes the unmanaged resources
  114. /// </summary>
  115. public void Dispose()
  116. {
  117. Dispose(true);
  118. GC.SuppressFinalize(this);
  119. }
  120. #endregion
  121. }
  122. }