PeriodicTimer.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. if (callback == null)
  16. {
  17. throw new ArgumentNullException("callback");
  18. }
  19. Callback = callback;
  20. _period = period;
  21. _state = state;
  22. StartTimer(dueTime);
  23. }
  24. void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
  25. {
  26. if (e.Mode == PowerModes.Resume)
  27. {
  28. DisposeTimer();
  29. StartTimer(Timeout.InfiniteTimeSpan);
  30. }
  31. }
  32. private void TimerCallback(object state)
  33. {
  34. Callback(state);
  35. }
  36. private void StartTimer(TimeSpan dueTime)
  37. {
  38. lock (_timerLock)
  39. {
  40. _timer = new Timer(TimerCallback, _state, dueTime, _period);
  41. SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
  42. }
  43. }
  44. private void DisposeTimer()
  45. {
  46. SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
  47. lock (_timerLock)
  48. {
  49. if (_timer != null)
  50. {
  51. _timer.Dispose();
  52. _timer = null;
  53. }
  54. }
  55. }
  56. public void Dispose()
  57. {
  58. DisposeTimer();
  59. }
  60. }
  61. }