Beispiel #1
0
 public void RemoveJob(SchedulerJob job)
 {
     lock (_jobs)
     {
         _jobs.Remove(job);
     }
 }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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();
        }