public IDisposable Schedule(TimeSpan dueTime, Action action) { if (action == null) { throw new ArgumentNullException("action"); } var dt = Time + Scheduler.Normalize(dueTime); var si = new ScheduledItem(action, dt); var queue = GetQueue(); if (queue == null) { queue = new SchedulerQueue(4); queue.Enqueue(si); CurrentThreadScheduler.SetQueue(queue); try { Trampoline.Run(queue); } finally { CurrentThreadScheduler.SetQueue(null); } } else { queue.Enqueue(si); } return(si.Cancellation); }
public static void Run(SchedulerQueue queue) { while (queue.Count > 0) { var item = queue.Dequeue(); if (!item.IsCanceled) { var wait = item.DueTime - CurrentThreadScheduler.Time; if (wait.Ticks > 0) { Thread.Sleep(wait); } if (!item.IsCanceled) { item.Invoke(); } } } }
private static void SetQueue(SchedulerQueue newQueue) { s_threadLocalQueue = newQueue; }