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

