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

Blazor InputSelect触发UI更新:网格加载时无法显示等待Spinner

问题解决思路

你的问题核心是同步加载阻塞了UI线程,导致Blazor没机会更新界面显示Spinner。当你在属性setter里同步调用LoadGrid时,整个流程是:

  1. 把dataGrid设为null
  2. 同步执行耗时的ADMIN_FeeList方法(完全阻塞UI线程)
  3. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:35:28