#395·reactive

Implement a real throttle (not debounce, like the existing throttle)

Author: cmeerenCreated Apr 21, 2017Updated May 21, 2026
Labels[area] Rxfeature request

Currently there is no operator to ignore elements from an observable sequence that follow a non-ignored element within a specified relative time duration. This is what would normally be called Throttle, while the existing Throtte operator is really a debounce operator (see e.g. The Difference Between Throttling and Debouncing).

Here is a sample implementation of the "real" throttle operator both with and without scheduler:

csharp
public static IObservable<TSource> AtMostOnceEvery<TSource>(
    this IObservable<TSource> source,
    TimeSpan dueTime)
{
    IObservable<TSource> delay = Observable.Empty<TSource>().Delay(dueTime);
    return source.Take(1).Concat(delay).Repeat();
}

public static IObservable<TSource> AtMostOnceEvery<TSource>(
    this IObservable<TSource> source,
    TimeSpan dueTime,
    IScheduler scheduler)
{
    IObservable<TSource> delay = Observable.Empty<TSource>().Delay(dueTime, scheduler);
    return source.Take(1).Concat(delay).Repeat();
}