public static IObservable <long> RandomTimer( Duration dueTime, Duration minPeriod, Duration maxPeriod, IScheduler scheduler = null) { return(Observable.Create <long>(o => { scheduler = scheduler ?? Scheduler.Default; var rand = new RandomDuration(minPeriod, maxPeriod); long value = 0; IObservable <long> initial = Observable.Timer(dueTime, scheduler).Select(_ => value++); IObservable <long> rest = Observable.Return(0, scheduler) .SelectMany(_ => Observable.Timer(TimeSpan.FromMilliseconds(rand.Next()), scheduler)) .Select(_ => value++) .Repeat(); return initial.Concat(rest).Subscribe(o); })); }