private void UnsafeScheduleNext() { if (_workQueue.Count == 0) { return; } _cts = new CancellationTokenSource(); _currentEntry = _workQueue.Min; CancellationToken token = _cts.Token; Task.Delay(BoundToZero(_currentEntry.Date - DateTime.Now), _cts.Token).ContinueWith(new Action<Task>((task) => { lock(this) { if (!token.IsCancellationRequested) { _currentEntry.RunTask(); _workQueue.Remove(_currentEntry); UnsafeScheduleNext(); } } }), _cts.Token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Default); }
public SchedulerEntry Add(DateTime date, Action action) { lock (this) { SchedulerEntry entry = new SchedulerEntry(date, action); _workQueue.Add(date, entry); if (_currentEntry != _workQueue.Min) { if (_currentEntry != null) { UnsafeCancelCurrent(); } UnsafeScheduleNext(); } return entry; } }
private void UnsafeCancelCurrent() { _cts.Cancel(); _currentEntry = null; _cts = null; }