Razor Page的OnGet使用async/await会导致控件加载不稳定吗?
问题根源与解决方法
你的问题根本原因不是async/await从数据库取数据不合适,而是Razor Page的异步OnGet方法误用了async void返回类型。
为什么会出现加载不稳定
ASP.NET Core无法跟踪返回void的异步方法执行状态,当你用async void OnGet时,框架不会等待方法内的异步操作(比如数据库查询)完成就开始渲染页面。这就导致了竞态条件:
- 当数据库查询速度快时,
RoleList在页面渲染前已经赋值,MultiSelect能正常加载选项; - 当查询速度慢时,页面渲染时
RoleList还未被赋值,MultiSelect就会显示空选项列表。
同步方法不存在这个问题,因为同步代码会阻塞到所有数据加载完成后才开始渲染页面。
解决方法:修改OnGet的返回类型为Task
Razor Page的异步处理方法必须返回Task,框架会等待该Task完成后再渲染页面。修改你的异步OnGet方法:
public async Task OnGet(int securityGroupId) { if (securityGroupId == -1) { SecurityGroup = new SecurityGroup(); SecurityGroup.IsActive = true; } else { SecurityGroup = await DL.GetEntityByIdAsync<SecurityGroup, int>(securityGroupId); } RoleList = await DL.GetLookupListAsync<Role>(); RoleList = RoleList.OrderBy(r => r.Text).ToList(); }
额外验证点
你的数据库异步方法(GetEntityByIdAsync、GetLookupListAsync)实现是正确的,返回Task<T>类型且正确使用了await,不需要修改。
内容的提问来源于stack exchange,提问作者Legion
相关产品推荐
相关产品推荐

