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

Blazor Server多按钮异步点击的有序执行方案咨询

Blazor异步按钮点击按序执行解决方案

场景与需求

有多个按钮(以3个为例),每个按钮点击后触发的异步处理程序包含多个await调用,且都会操作同一个需要刷新UI的共享对象。要求:

  • 用户按顺序点击按钮后,每个按钮的处理逻辑必须严格按点击顺序完整执行
  • 处理第一个按钮时,不能禁用其他按钮(允许用户继续点击排队)
  • 全程使用异步代码,避免阻塞Blazor共享线程

试过的无效方案分析

  • Semaphore.WaitAsync:只能控制并发数量,但无法保证请求的执行顺序,不符合按点击顺序执行的要求
  • lock关键字:属于同步锁,会阻塞线程,违反“不能使用非异步代码”的限制
  • 自行创建线程:Blazor中直接操作线程容易引发UI线程冲突,且额外增加系统复杂度

可行方案:AsyncLock

使用AsyncLock可以完美解决问题:它是异步友好的锁机制,既能保证同一时间只有一个异步操作在执行,还能严格按照请求的先后顺序排队处理,完全满足所有需求。

代码示例

在Blazor组件中的典型用法:

// 初始化异步锁(可通过Nito.AsyncEx库引入或自行实现)
private readonly AsyncLock _asyncLock = new AsyncLock();

private async Task OnButtonClick(int buttonIndex)
{
    // 进入异步锁,自动按请求顺序排队等待
    using (await _asyncLock.LockAsync())
    {
        // 包含多个await的业务逻辑,操作共享UI对象
        await FetchDataAsync(buttonIndex);
        UpdateSharedUIState(buttonIndex);
        await SaveChangesAsync();
        // 通知Blazor刷新UI
        StateHasChanged();
    }
}

内容的提问来源于stack exchange,提问作者Denny Weinberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:45:02