public void Run()
 {
     if (!ExecutingThread.CompareAndSet(null, Thread.CurrentThread))
     {
         throw new SchedulingException("The SchedulerTask is already running.");
     }
     while (_active)
     {
         try {
             TriggeredTask task = _outer._scheduledTasks.Take();
             //if this thread is not active anymore, clear
             if (_active)
             {
                 _outer._executor.Execute(task);
             }
             else
             {
                 _outer._scheduledTasks.Offer(task);
             }
         }
         catch (ThreadInterruptedException) {
             Thread.CurrentThread.Interrupt();
             break;
         }
     }
     ExecutingThread.Value = null;
 }
        public IScheduledFuture <object> Schedule(IRunnable task, ITrigger trigger)
        {
            AssertUtils.ArgumentNotNull(task, "task must not be null");
            TriggeredTask triggeredTask = new TriggeredTask(this, task, trigger);

            return(Schedule(triggeredTask, DateTime.MinValue, DateTime.MinValue));
        }
        private IScheduledFuture <object> Schedule(TriggeredTask triggeredTask, DateTime lastScheduledRunTime, DateTime lastCompleteTime)
        {
            DateTime nextRunTime = triggeredTask.Trigger.GetNextRunTime(lastScheduledRunTime, lastCompleteTime);

            if (nextRunTime != DateTime.MinValue)
            {
                triggeredTask.ScheduledTime = nextRunTime;
                _scheduledTasks.Offer(triggeredTask);
            }
            return(triggeredTask);
        }