如何在用户再次点击时取消正在执行的按钮点击事件?
解决按钮重复点击时取消之前的延迟任务
要实现新点击触发时立即取消之前的延迟任务,你可以使用CancellationTokenSource来跟踪和取消异步延迟操作,具体修改如下:
步骤1:添加类级别的取消令牌源字段
在你的类中添加一个CancellationTokenSource实例,用于管理当前的延迟任务:
private CancellationTokenSource _scrollDelayCts;
步骤2:修改点击事件处理程序
更新事件处理逻辑,每次点击时先取消之前的任务,再执行新操作:
private async void ClickEventHandler(ClickEvent obj) { // 取消并清理之前的延迟任务 _scrollDelayCts?.Cancel(); _scrollDelayCts?.Dispose(); _scrollDelayCts = new CancellationTokenSource(); // 优化查找逻辑:直接用FindIndex替代FirstOrDefault+IndexOf int indexOfSelectedItem = this.List.FindIndex(x => Convert.ToDouble(x.Value) == obj.Value); if (indexOfSelectedItem > -1) { // 调整列表顺序 for (int i = 0; i < indexOfSelectedItem; i++) { var item = this.List.ElementAtOrDefault(0); if (item != null) { this.List.RemoveAt(0); this.List.Add(item); } } this.IsScrollEnabled = false; try { // 带取消令牌的延迟操作 await Task.Delay(3000, _scrollDelayCts.Token); // 仅当任务未被取消时,恢复滚动状态 this.IsScrollEnabled = true; } catch (OperationCanceledException) { // 任务被新点击取消,无需执行状态恢复 } finally { // 清理资源,避免内存泄漏 _scrollDelayCts.Dispose(); _scrollDelayCts = null; } } }
逻辑说明
- 每次点击时,先终止并清理上一次的延迟任务,确保旧任务不会再修改
IsScrollEnabled状态。 - 使用带取消令牌的
Task.Delay,当新点击触发时,旧的延迟任务会被立即取消,抛出OperationCanceledException,我们捕获该异常后跳过状态恢复操作。 - 优化了列表索引查找逻辑,用
FindIndex一步完成元素定位,提升代码效率。
内容的提问来源于stack exchange,提问作者Laxmi
相关产品推荐
相关产品推荐

