internal IDisposable Schedule(Action action, TimeSpan initialDelay, TimeSpan period) { if (Volatile.Read(ref shutdown)) { return(EmptyDisposable.Instance); } SequentialDisposable inner = new SequentialDisposable(); SequentialDisposable outer = new SequentialDisposable(inner); long due = SchedulerHelper.NowUTC() + (long)initialDelay.TotalMilliseconds; long id = Interlocked.Increment(ref index); long[] count = { 0 }; Action recursive = null; recursive = () => { action(); var duePeriod = due + (long)(++count[0] * period.TotalMilliseconds); var idPeriod = Interlocked.Increment(ref index); var periodTT = new TimedTask(recursive, duePeriod, idPeriod, queue); if (Offer(periodTT)) { outer.Replace(periodTT); } }; var tt = new TimedTask(recursive, due, id, queue); if (Offer(tt)) { inner.Replace(tt); return(outer); } return(EmptyDisposable.Instance); }