public void RemoveJob(SchedulerJob job) { lock (_jobs) { _jobs.Remove(job); } }
public virtual SchedulerJob ScheduleAsync(DateTime time, ISchedulerJob toExecute) { lock (_jobLocker) { var job = new SchedulerJob(toExecute, time.ToUniversalTime(), ScheduleType.Once, true); _jobs.Add(job); if (_semaphore.CurrentCount == 0) { _semaphore.Release(); } return(job); } }
public virtual SchedulerJob ScheduleAsync(TimeSpan ts, ISchedulerJob toExecute, bool recurring) { lock (_jobLocker) { var job = new SchedulerJob(toExecute, ts, recurring ? ScheduleType.Recurring : ScheduleType.Once, true); _jobs.Add(job); if (_semaphore.CurrentCount == 0) { _semaphore.Release(); } return(job); } }
protected virtual void Run() { new Thread(() => { while (Running) { try { IEnumerable <SchedulerJob> jobs; lock (_jobLocker) { jobs = _jobs.Where(p => p.NextExecuteDate >= DateTime.UtcNow); } foreach (SchedulerJob job in jobs) { job.Execute(); if (job.ScheduleType == ScheduleType.Once) { lock (_jobLocker) { _jobs.Remove(job); } } } SchedulerJob sJob = null; lock (_jobLocker) { _jobs.Sort(); if (_jobs.Count > 0) { sJob = _jobs.First(); } _cts = new CancellationTokenSource(); } var tasks = new List <Task> { _semaphore.WaitAsync(_cts.Token) }; if (sJob != null) { TimeSpan ts = (sJob.NextExecuteDate - DateTime.UtcNow).Duration(); tasks.Add(Task.Delay(ts, _cts.Token)); } Task.WhenAny(tasks).Wait(); _cts.Cancel(); } catch { } finally { Thread.Sleep(1); } } }).Start(); }