使用 CancellationTokenSource 實現防抖
private CancellationTokenSource _debounceCts;
private const int DebounceDelay = 500; // 毫秒
// 拖拽事件中調用
public void OnTimelineDrag(object newTime)
{
// 每次拖拽都取消上一個任務
_debounceCts?.Cancel();
_debounceCts = new CancellationTokenSource();
var token = _debounceCts.Token;
// 啟動一個延遲任務,如果中途被取消就不會執行查詢
_ = DebounceQueryAsync(newTime, token);
}
private async Task DebounceQueryAsync(object newTime, CancellationToken token)
{
try
{
await Task.Delay(DebounceDelay, token); // 延遲 0.5 秒,如果期間有新操作就取消
// token 沒被取消,說明用戶停止拖拽了
QueryDataAndRenderUI(newTime);
}
catch (TaskCanceledException)
{
// 被取消,無需操作
}
}
private void QueryDataAndRenderUI(object time)
{
// 查詢數據
var data = QueryData(time);
// 渲染 UI(在 UI 線程中執行,如果需要)
Application.Current.Dispatcher.Invoke(() =>
{
RenderUI(data);
});
}
?? 說明
-
每次拖拽操作會取消上一次的任務。
-
如果用戶停下來 0.5 秒沒再操作,就執行查詢和 UI 更新。
-
不用
Timer,全部用async/await和CancellationToken實現,非常適合現代 C# 應用(WPF / WinForms / MAUI / etc.)。
? 優點
-
避免了頻繁調用查詢邏輯。
-
沒有 Timer,也沒有額外線程。
-
可讀性和控制力強。
-
可以集成到 ViewModel 或組件中。

浙公網安備 33010602011771號