public DateTimeOffset?ScheduleNext(DateTimeOffset from) { if (!delayFirstIteration && scheduledFirst.TrySetTrue()) { return(from); } var period = periodProvider(); var jitter = jitterProvider(); period = TimeSpanArithmetics.Max(TimeSpan.Zero, period); jitter = Math.Max(0d, jitter); jitter = Math.Min(1d, jitter); var next = from + period; if (jitter > 0d) { next += period.Multiply(ThreadSafeRandom.NextDouble() * jitter * (ThreadSafeRandom.FlipCoin() ? 1d : -1d)); } return(next); }