namespace MeloongCore;
public enum RateLimitMode {
/// Throttle:立即执行一次,然后一段时间内合并为一次尾随执行。
ImmediateThenMerge,
/// Debounce (leading):立即执行一次,然后忽略一段时间内的后续调用。
ImmediateThenIgnore,
/// Debounce (trailing):不立即执行,直到一段时间内不再有任何新调用后再执行一次。
WaitUnillNoNewInvoke,
}
///
/// 对高频调用进行限制。
/// 详见:
///
public class RateLimitedWorker(Action workload, double minimalIntervalMs, RateLimitMode mode) : IDisposable {
private readonly RateLimitedAction action = mode switch {
RateLimitMode.ImmediateThenMerge => Throttler.Throttle(workload, TimeSpan.FromMilliseconds(minimalIntervalMs), leading: true, trailing: true),
RateLimitMode.WaitUnillNoNewInvoke => Debouncer.Debounce(workload, TimeSpan.FromMilliseconds(minimalIntervalMs), leading: false, trailing: true),
_ => Debouncer.Debounce(workload, TimeSpan.FromMilliseconds(minimalIntervalMs), leading: true, trailing: false)
};
public void Start() {
if (!disposed) action.Invoke();
}
private bool disposed = false;
public virtual void Dispose() {
if (disposed) return;
disposed = true;
action.Dispose();
}
}