public void Start() { _isStopped = false; ThreadPool.QueueUserWorkItem(state => { ScheduledAction scheduledAction = null; while (!_isStopped) { bool any; lock (_actions) { any = _actions.Count > 0; if (any) { scheduledAction = _actions[0]; } } TimeSpan timeToWait; if (any) { var runTime = scheduledAction.NextExecutionDate; var dT = runTime - DateTimeProvider.UtcNow; timeToWait = dT > TimeSpan.Zero ? dT : TimeSpan.Zero; } else { timeToWait = TimeSpan.FromMilliseconds(-1); } if (_resetEvent.WaitOne(timeToWait, false)) { continue; } Debug.Assert(scheduledAction != null, "scheduledAction != null"); scheduledAction.Execute(); lock (_actions) { Remove(scheduledAction); if (scheduledAction.Repeat) { QueueForever(scheduledAction.Action, scheduledAction.Interval); } } } }); }