ASP.NET Core 7中DbContext多线程并发异常排查求助
问题分析与解决方案
问题根源
你的代码确实存在导致该异常的问题,问题出在Index方法的投影查询中:
Roles = _userManager.GetRolesAsync(user).Result
_userManager.GetRolesAsync(user)是异步操作,但你用.Result强制同步等待,会导致线程阻塞。- 当
await _userManager.Users.Select(...).ToListAsync()执行时,EF正在使用同一个DbContext遍历用户数据,此时在投影中发起另一个依赖该上下文的数据库查询(获取角色),会造成同一个DbContext实例同时处理多个操作,触发InvalidOperationException。
修复方案
修改Index方法,先获取所有用户,再逐个异步获取角色(避免在EF查询投影中嵌套数据库操作):
public async Task<IActionResult> Index() { // 先获取所有用户实体 var users = await _userManager.Users.ToListAsync(); var userViewModels = new List<UserViewModel>(); foreach (var user in users) { // 异步获取当前用户的角色 var roles = await _userManager.GetRolesAsync(user); userViewModels.Add(new UserViewModel { Id = user.Id, FirstName = user.FirstName, LastName = user.LastName, UserName = user.UserName, Email = user.Email, Roles = roles }); } return View(userViewModels); }
注意事项
- DbContext实例不是线程安全的,禁止在同一上下文上同时发起多个操作。
- 避免在EF的查询投影(
Select)中嵌套数据库操作,尤其是同步等待异步方法的调用。 - 始终使用
await处理异步操作,不要用.Result或.Wait(),防止线程阻塞和上下文冲突。
内容的提问来源于stack exchange,提问作者Ahmed el-shiekh
相关产品推荐
相关产品推荐

