PeriodicTimer.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Threading;
  3. using Microsoft.Win32;
  4. namespace MediaBrowser.Common.Threading
  5. {
  6. public class PeriodicTimer : IDisposable
  7. {
  8. public Action<object> Callback { get; set; }
  9. private Timer _timer;
  10. private readonly object _state;
  11. private readonly object _timerLock = new object();
  12. private readonly TimeSpan _period;
  13. public PeriodicTimer(Action<object> callback, object state, TimeSpan dueTime, TimeSpan period)
  14. {
  15. Callback = callback;
  16. _period = period;
  17. _state = state;
  18. StartTimer(dueTime);
  19. }
  20. void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
  21. {
  22. if (e.Mode == PowerModes.Resume)
  23. {
  24. DisposeTimer();
  25. StartTimer(Timeout.InfiniteTimeSpan);
  26. }
  27. }
  28. private void TimerCallback(object state)
  29. {
  30. Callback(state);
  31. }
  32. private void StartTimer(TimeSpan dueTime)
  33. {
  34. lock (_timerLock)
  35. {
  36. _timer = new Timer(TimerCallback, _state, dueTime, _period);
  37. SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
  38. }
  39. }
  40. private void DisposeTimer()
  41. {
  42. SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
  43. lock (_timerLock)
  44. {
  45. if (_timer != null)
  46. {
  47. _timer.Dispose();
  48. _timer = null;
  49. }
  50. }
  51. }
  52. public void Dispose()
  53. {
  54. DisposeTimer();
  55. }
  56. }
  57. }