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
相关产品推荐
相关产品推荐

