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