using System;
using System.Threading;
using System.Threading.Tasks;
public class Debouncer : IDisposable
{
public Debouncer(TimeSpan interval, Action action)
{
_interval = interval;
_action = action;
}
private volatile Timer? _timer;
private readonly TimeSpan _interval;
private readonly Action _action;
public void Debounce()
{
Reset();
_timer = new Timer(OnTimer, null, (int)_interval.TotalMilliseconds, Timeout.Infinite);
}
private void OnTimer(object state)
{
Reset();
_action?.Invoke();
}
private void Reset()
{
_timer?.Dispose();
_timer = null;
}
public void Dispose() => Reset();
}
public class Program
{
async static Task Main()
{
Console.WriteLine("start");
var d = new Debouncer(TimeSpan.FromSeconds(2), () => Console.WriteLine("d"));
Console.WriteLine("abc");
d.Debounce();
await Task.Delay(1000);
Console.WriteLine("abc");
d.Debounce();
await Task.Delay(2500);
Console.WriteLine("abc");
d.Debounce();
await Task.Delay(4000);
Console.WriteLine("end");
}
}412700cookie-checkC# debouncer