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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:23:26