Beispiel #1
0
        public override IDisposable ScheduleAbsolute <TState> (TState state, TAbsolute dueTime, Func <IScheduler, TState, IDisposable> action)
        {
            ScheduledItemImpl <TAbsolute> t = null;

            t = new ScheduledItemImpl <TAbsolute> (dueTime, () => { tasks.Remove(t); return(action(this, state)); });
            AddTask(tasks, t);
            return(Disposable.Create(() => { tasks.Remove(t); t.Dispose(); }));
        }
Beispiel #2
0
        public override IDisposable ScheduleAbsolute <TState> (TState state, DateTimeOffset dueTime, Func <IScheduler, TState, IDisposable> action)
        {
            ScheduledItemImpl <DateTimeOffset> t = null;

            t = new ScheduledItemImpl <DateTimeOffset> (dueTime, () => { tasks.Remove(t); return(action(this, state)); });

            Scheduler.AddTask(tasks, t);

            return(new CompositeDisposable(Disposable.Create(() => tasks.Remove(t)), t));
        }
 public virtual IDisposable Schedule <TState> (TState state, DateTimeOffset dueTime, Func <IScheduler, TState, IDisposable> action)
 {
     if (dueTime <= Now)
     {
         return(Schedule(state, TimeSpan.Zero, action));
     }
     else
     {
         ScheduledItemImpl <DateTimeOffset>     task             = null;
         Func <IScheduler, TState, IDisposable> funcRemovingTask = (sch, stat) => {
             tasks.Remove(task);
             return(action(sch, stat));
         };
         task = new ScheduledItemImpl <DateTimeOffset> (dueTime, () => funcRemovingTask(this, state));
         tasks.Add(task);
         var reldis = Schedule(state, dueTime - Now, funcRemovingTask);
         return(Disposable.Create(() => {
             tasks.Remove(task);
             reldis.Dispose();
         }));
     }
 }
        public IDisposable Schedule <TState> (TState state, TimeSpan dueTime, Func <IScheduler, TState, IDisposable> action)
#endif
        {
            // FIXME: this sort of needs to handle correct cancellation. (Though there's not likely many chances to "cancel" it...)
            var task = new ScheduledItemImpl <TimeSpan> (dueTime, () => action(this, state));

            if (Interlocked.CompareExchange(ref busy, busy, busy + 1) > 0)
            {
                AddTask(tasks, task);
                return(Disposable.Create(() => tasks.Remove(task)));
            }
            else
            {
                try {
                    Thread.Sleep(Scheduler.Normalize(task.DueTime));
                    task.Invoke();
                    while (true)
                    {
                        ScheduledItem <TimeSpan> t;
                        lock (tasks) {
                            t = (ScheduledItem <TimeSpan>)tasks.FirstOrDefault();
                            if (t == null)
                            {
                                break;
                            }
                            tasks.Remove(t);
                        }
                        Thread.Sleep(Scheduler.Normalize(t.DueTime));
                        t.Invoke();
                    }
                } finally {
                    busy--;
                }
                return(Disposable.Empty);
            }
        }