You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在用户再次点击时取消正在执行的按钮点击事件?

解决按钮重复点击时取消之前的延迟任务

要实现新点击触发时立即取消之前的延迟任务,你可以使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:00:55