| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | using System;using System.Threading;using Microsoft.Win32;namespace MediaBrowser.Server.Implementations.Threading{    public class PeriodicTimer : IDisposable    {        public Action<object> Callback { get; set; }        private Timer _timer;        private readonly object _state;        private readonly object _timerLock = new object();        private readonly TimeSpan _period;        public PeriodicTimer(Action<object> callback, object state, TimeSpan dueTime, TimeSpan period)        {            if (callback == null)            {                throw new ArgumentNullException("callback");            }            Callback = callback;            _period = period;            _state = state;            StartTimer(dueTime);        }        void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)        {            if (e.Mode == PowerModes.Resume)            {                DisposeTimer();                StartTimer(Timeout.InfiniteTimeSpan);            }        }        private void TimerCallback(object state)        {            Callback(state);        }        private void StartTimer(TimeSpan dueTime)        {            lock (_timerLock)            {                _timer = new Timer(TimerCallback, _state, dueTime, _period);                SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;            }        }        private void DisposeTimer()        {            SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;                        lock (_timerLock)            {                if (_timer != null)                {                    _timer.Dispose();                    _timer = null;                }            }        }        public void Dispose()        {            DisposeTimer();        }    }}
 |