#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
}
}