Blazor InputSelect触发UI更新:网格加载时无法显示等待Spinner
问题解决思路
你的问题核心是同步加载阻塞了UI线程,导致Blazor没机会更新界面显示Spinner。当你在属性setter里同步调用LoadGrid时,整个流程是:
- 把dataGrid设为null
- 同步执行耗时的ADMIN_FeeList方法(完全阻塞UI线程)
- 给dataGrid赋值
整个过程中UI线程被卡住,直到LoadGrid完全执行完才会刷新界面,所以Spinner根本没机会显示。
解决方案步骤
1. 将加载方法改为异步
把同步的LoadGrid改成异步方法,利用async/await释放UI线程,让Blazor能及时更新界面:
private async Task LoadGridAsync() { // 先清空网格数据,触发Spinner显示条件 dataGrid = null; // 手动通知Blazor立即更新UI StateHasChanged(); // 将耗时的同步操作放到后台线程执行,避免阻塞UI await Task.Run(() => { PT_Grid_Admin ptGrid = new PT_Grid_Admin(permitTraxLibrary, gridParams); dataGrid = ptGrid.ADMIN_FeeList(feeList.Fee_Key, selectedGroup); }); // 加载完成后再次通知UI更新,显示网格组件 StateHasChanged(); }
2. 修改属性setter的调用方式
C#的属性setter不支持异步语法,所以我们在setter里异步触发加载方法即可:
private string selectedGroup1 = ""; public string selectedGroup { get => selectedGroup1; set { selectedGroup1 = value; // 异步调用加载方法,不等待返回,避免阻塞UI线程 _ = LoadGridAsync(); } }
额外优化点
如果ADMIN_FeeList本身提供了异步版本(比如ADMIN_FeeListAsync),直接调用异步方法替代Task.Run包裹同步方法,性能会更优:
private async Task LoadGridAsync() { dataGrid = null; StateHasChanged(); PT_Grid_Admin ptGrid = new PT_Grid_Admin(permitTraxLibrary, gridParams); dataGrid = await ptGrid.ADMIN_FeeListAsync(feeList.Fee_Key, selectedGroup); StateHasChanged(); }
这样修改后,当你切换InputSelect的选项时,UI会立刻显示Spinner,直到耗时的网格加载完成后自动切换为Grid组件。
内容的提问来源于stack exchange,提问作者Bitco Software
相关产品推荐
相关产品推荐

