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 (timeToWait != TimeSpan.Zero) { if (_resetEvent.WaitOne(timeToWait, false)) { continue; } } scheduledAction.Execute(); lock (_actions) { Remove(scheduledAction); if (scheduledAction.Repeat) { QueueForever(scheduledAction.Name, scheduledAction.Action, scheduledAction.Interval); } } } }); }
private void QueueInternal(ScheduledAction scheduledAction) { lock (_actions) { var pos = _actions.BinarySearch(scheduledAction, ScheduledAction.Comparer); pos = pos >= 0 ? pos : ~pos; _actions.Insert(pos, scheduledAction); if (pos == 0) { _resetEvent.Set(); } } }
private void Remove(ScheduledAction scheduledAction) { var pos = _actions.BinarySearch(scheduledAction, ScheduledAction.Comparer); scheduledAction.Release(); if (pos >= 0) { _actions.RemoveAt(pos); } if (pos == 0) { _resetEvent.Set(); } }
public void QueueOneTime(string name, Action action, TimeSpan interval) { QueueInternal(ScheduledAction.Create(name, action, interval, false)); }
public void QueueForever(string name, Action action, TimeSpan interval) { QueueInternal(ScheduledAction.Create(name, action, interval, true)); }