# 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Debouncer
{
private CancellationTokenSource cancellationTokenSource = new();

/// <summary>
/// 防抖
/// </summary>
/// <param name="callback">要执行的方法</param>
/// <param name="waitTime">等待时间(毫秒)</param>
public void Debounce(Action callback, int waitTime)
{
// 取消之前的延时调用
cancellationTokenSource.Cancel();
cancellationTokenSource = new CancellationTokenSource();

Task.Delay(waitTime, cancellationTokenSource.Token)
.ContinueWith(task =>
{
if (!task.IsCanceled)
{
callback();
}
});
}
}
  • 每次调用防抖函数时都会取消旧任务并创建新的任务。
  • 当 Delay 指定时间之后,若当前任务未取消则执行回调,若已取消则直接返回