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;
 }