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