#region --------------- Copyright Dresser Wayne Pignone ------------- /* * $Log: /Wrk/WayneLibraries/Wrk/StateEngine/TimerWrapper.cs $ * * 1 08-03-18 11:07 roger.månsson * Created. */ #endregion using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace Wayne.Lib.StateEngine { /// /// Wraps a System.Threading.Timer together with an optional state engine timer. It is used /// to make it possible to reuse the Timer object, since it is quite expensive to create and /// destroy timers all the time. Now we only change the intervals on the timers, and disable them /// when they should not be active anymore. /// class TimerWrapper : IDisposable { private readonly TimerCallback timerCallback; #region Fields private bool disposed = false; StateEngine.Timer stateEngineTimer; System.Threading.Timer realTimer; #endregion #region Construction /// /// Initializes a new instance of the TimerWrapper class. /// /// Delegate that should be invoked when timer fires. public TimerWrapper(TimerCallback timerCallback) { this.timerCallback = timerCallback; realTimer = new System.Threading.Timer(timerCallback, this, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); } /// /// Finalizer /// ~TimerWrapper() { Dispose(false); } #endregion #region Properties /// /// Gets or sets the State Engine timer. /// public StateEngine.Timer StateEngineTimer { get { return stateEngineTimer; } set { stateEngineTimer = value; } } #endregion #region Methods /// /// Disables the underlying timer. /// internal void Disable() { if(!disposed) realTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); } /// /// Enables the underlying timer. /// internal void Enable() { if (stateEngineTimer == null) throw new InvalidOperationException("Can not enable timer when no StateEngine timer is connected."); if (stateEngineTimer.IsPeriodic) realTimer.Change(stateEngineTimer.Interval, stateEngineTimer.Interval); else realTimer.Change(stateEngineTimer.Interval, System.Threading.Timeout.Infinite); } /// /// Fires the timer wrapper immediately. /// public void Fire() { if (timerCallback != null) timerCallback(this); } #endregion #region IDisposable Members /// /// Disposes the unmanaged resources /// /// protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { if (realTimer != null) { realTimer.Dispose(); } realTimer = null; } if (realTimer != null) { realTimer.Dispose(); } realTimer = null; } disposed = true; } /// /// Disposes the unmanaged resources /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion } }