Beispiel #1
0
        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);
                        }
                    }
                }
            });
        }