异步等待foreach

时间:2017-09-28 10:43:55

标签: c# entity-framework

我在await循环中遇到foreach的问题:

foreach (var role in data.Roles)
{
    var selectedRole = await roleRepo.GetRole(role.Code);
}

public async Task<Role> GetRole(string roleCode)
{
    var role = await _dbContext.Set<Role>().FindAsync(id);
    return role;
}

正如我脑子里的代码所说,它应该按照以下顺序工作:

  1. Do Call方法GetRole
  2. 等到GetRole完成
  3. 继续下一次迭代
  4. 但是在运行时它是这样的:

    1. Do Call方法获取角色
    2. 迭代到下一个循环,无论呼叫是否结束
    3. 随后,实体框架会抛出类似A second operation started on this context before a previous asynchronous...
    4. 的错误

      我现在正在使用EF和webapi2。有人可以解释是什么导致了这个吗?

      更新

      感谢您的回复,我很抱歉,因为这是我的第一个问题,我不会遵循最小,完整和可验证的示例。

      虽然发现了问题的主要来源,但在此之前我还没有意识到这种方法尚未实现。 对不起你们的麻烦,谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

如果Jon Skeet不确定的话,我不愿发布这个...但对我来说,看起来它正在按照你的要求行事。你已经为var selectedRole指定了await ......但你真的想让它同步运行吗?

如果你尝试会发生什么:

foreach (var role in data.Roles)
{
    var selectedRole = roleRepo.GetRole(role.Code).Result;
}

这应该强制你的循环等到第一次迭代完成。这将帮助您找出我认为的问题。看看你的DbContext内容会很好......