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

为什么Blazor Server应用默认不显示加载指示器?

根因说明

默认FetchData模板不存在问题,问题出在模拟耗时操作的方式不符合异步开发规范。

  • Thread.Sleep(2000)是同步阻塞方法,会直接占用当前Blazor Server的调度线程:
    直接在OnInitializedAsync中调用GetForecastAsync时,线程进入方法后第一时间就会被阻塞2秒,还没来得及返回可等待的Task,也没有触发首次渲染的机会,直到阻塞结束后才会一次性完成渲染,所以看不到加载提示。
  • 用Task.Run包裹调用时,包含同步阻塞的逻辑会被丢到线程池的其他线程执行,Blazor主线程可以继续执行后续逻辑,先完成首次渲染展示"Loading..."提示,等后台任务执行完成后再触发二次渲染更新数据,所以能正常看到加载状态。

正确的模拟方案

如果要模拟真实的异步耗时场景,把GetForecastAsync中的Thread.Sleep(2000)替换为await Task.Delay(2000)即可。此时直接调用await ForecastService.GetForecastAsync(DateTime.Now)就能正常展示加载状态,不需要额外用Task.Run包裹。

注意事项

Blazor Server有专属的同步上下文调度逻辑,非必要场景不建议随意使用Task.Run调度任务,避免产生额外的线程开销和上下文切换问题。

内容的提问来源于stack exchange,提问作者Piotr Dabalaga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:54:02