namespace DeclarativeProperty; public class ThrottleProperty : DeclarativePropertyBase { private readonly object _lock = new(); private DateTime _lastFired = DateTime.MinValue; private readonly Func _interval; public ThrottleProperty( IDeclarativeProperty from, Func interval, Action? setValueHook = null) : base(from.Value, setValueHook) { _interval = interval; AddDisposable(from.Subscribe(SetValue)); } private async Task SetValue(T? next, CancellationToken cancellationToken = default) { lock (_lock) { if (DateTime.Now - _lastFired < _interval()) { return; } _lastFired = DateTime.Now; } await SetNewValueAsync( next, cancellationToken ); } }