public class Throttle
{
public Throttler(TimeSpan throttleTime) { ThrottleTime = throttleTime; }
private DateTime? Last = null;
private readonly TimeSpan ThrottleTime;
private readonly object Locker = new();
public DateTime? LastUsed() => Last ?? DateTime.Now;
public void Update() => Last = DateTime.Now;
public bool CanFire()
{
lock(Locker)
{
bool canFire = Last == null || (DateTime.Now - Last).Value > ThrottleTime;
if (canFire) Update();
return canFire;
}
}
}
// Usage:
public Throttle PopupOpenThrottle = new Throttle(TimeSpan.FromSeconds(1));
private void LeVariant_PopupClosing(object sender, ClosingPopupEventArgs e)
{
PopupOpenThrottle.Update();
}
private void LeVariant_GotFocus(object sender, RoutedEventArgs e)
{
if (sender is VariantEditor editor) {
if (!editor.IsPopupOpen && PopupOpenThrottle.CanFire())
{
editor.ShowPopup();
}
}
}
public class ThrottleDictionary
{
public ThrottleDictionary(TimeSpan throttleTime)
{
this.throttleTime = throttleTime;
}
private readonly Dictionary<string, Throttle> keyValuePairs = new Dictionary<string, Throttle>();
private readonly TimeSpan throttleTime;
public Throttle Get(string key) => keyValuePairs.GetOrAdd(key, () => new Throttle(throttleTime));
}
632400cookie-checkC# Basic Throttle