using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using System.Windows.Threading; using WinThread = System.Threading; namespace WatchdogLib.Thread { /// /// Wrapper class around Timer Objects /// public class TTimer : IDisposable { // private Members private Timer _Timer = new Timer(); private bool _disposed = false; private Dispatcher _Dispatcher = null; private ElapsedEventHandler _DispatchedElapsedEvent = null; /// /// Creates a new Multi-threaded System.Timer /// /// Event Handler for Timer /// Interval in Miliseconds /// True to start the timer upon creation, false otherwise /// A Timer Object, which should be Disposed by Caller //public TTimer(ElapsedEventHandler ElapsedHandler, int IntervalMiliseconds = 1000, bool StartEnabled = false, bool bUseDispatcher = true) public TTimer(ElapsedEventHandler ElapsedHandler, int IntervalMiliseconds, bool StartEnabled, bool bUseDispatcher) { if (ElapsedHandler != null) { _Timer = new System.Timers.Timer(); // The Primary Dispatcher thread is the thread that called us if (bUseDispatcher) { _Dispatcher = Dispatcher.CurrentDispatcher; _DispatchedElapsedEvent = ElapsedHandler; _Timer.Elapsed += new ElapsedEventHandler(_Timer_Elapsed); } else { _Timer.Elapsed += ElapsedHandler; } // Set the Interval / start _Timer.Interval = IntervalMiliseconds; _Timer.Enabled = StartEnabled; if (StartEnabled) _Timer.Start(); // Keep the timer alive GC.KeepAlive(_Timer); } } /// /// For Dispatching the Event to the Primary Dispatcher Thread /// void _Timer_Elapsed(object sender, ElapsedEventArgs e) { object[] param_s = new object[] { sender, e }; _Dispatcher.Invoke((ElapsedEventHandler)_DispatchedElapsedEvent, param_s); } /// /// Manually Start the Timer /// public void Start() { Stop(); // First Stop(), an existing Timer _Timer.Enabled = true; _Timer.Start(); } /// /// Manually Start the Timer at a new Interval /// /// Interval in Miliseconds public void Start(uint IntervalMiliseconds) { Stop(); // First Stop(), an existing Timer _Timer.Interval = IntervalMiliseconds; _Timer.Enabled = true; _Timer.Start(); } /// /// Manually Start the Timer at a new Interval /// /// Interval as a TimeSpan public void Start(TimeSpan tsInterval) { Stop(); // First Stop(), an existing Timer _Timer.Interval = tsInterval.TotalMilliseconds; _Timer.Enabled = true; _Timer.Start(); } /// /// Manually Stop the Timer /// public void Stop() { _Timer.Enabled = false; _Timer.Stop(); } #region IDisposable Members public void Dispose() { Dispose(true); // Use SupressFinalize in case a subclass // of this type implements a finalizer GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) { if (_Timer != null) _Timer.Dispose(); } // Indicate that the instance has been disposed. _Timer = null; _disposed = true; } } #endregion } }