【问题标题】:Multi-async in Entity Framework 6?Entity Framework 6 中的多异步?
【发布时间】:2014-01-04 21:34:07
【问题描述】:

这是我的代码:

var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);

但是当我从控制器调用函数时。显示错误

在前一个异步操作完成之前,在此上下文上启动了第二个操作。使用 'await' 确保在此上下文上调用另一个方法之前已完成任何异步操作。不保证任何实例成员都是线程安全的。

请帮我解决这个问题。

【问题讨论】:

  • 我有 2 个任务。如果我运行每个任务。这是成功。但如果我像上面的代码一样运行。这是错误

标签: entity-framework asynchronous entity-framework-6


【解决方案1】:

该异常清楚地解释了每个上下文一次只允许一个异步操作。

因此,您必须按照错误消息的提示,一次await 他们:

var banner = await context.Banners.ToListAsync();
var newsGroup = await context.NewsGroups.ToListAsync();

或者您可以使用多个上下文:

var banner = context1.Banners.ToListAsync();
var newsGroup = context2.NewsGroups.ToListAsync();
await Task.WhenAll(banner, newsGroup);

【讨论】:

  • 请注意,如果您有一个在查询中使用上下文的惰​​性变量,即使等待它也会抛出相同的错误,只需在查询之前获取属性,很难找到出这个。
  • @Pedro.The.Kid:作为一般规则,不要对异步数据库访问使用延迟加载。延迟加载始终是同步的,因此对附加数据使用包含或单独查询要好得多。
  • 是否有任何特定原因需要每个异步查询的上下文?我觉得这成为一个相当大的限制因素。
  • @Zapnologica:这正是 ES6 的设计方式。每个上下文一次只能处理一个查询。因此,如果您在下一个查询开始之前完成一个查询,您只需要一个上下文。如果您想同时进行多个查询,这只是一个问题。
  • @StephenCleary,我很难找到该查询,因为在异常之前我没有任何东西。有没有办法让我们找到当前正在执行的内容?谢谢
【解决方案2】:

如果您使用 IoC 容器进行数据提供程序注入,请考虑在您的生命周期中使用“transient”或“PerWebRequest”类型。

例如:https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md

【讨论】:

    【解决方案3】:

    如果您使用 Unity 进行依赖注入,例如存储库模式,您将在使用两个或更多上下文的 create/update/delete 时收到以下错误:

    无法定义两个对象之间的关系,因为 它们附加到不同的 ObjectContext 对象。

    这可以使用PerRequestLifetimeManager 解决。更多信息在这里:

    C# EF6 make multiple async calls to one context using Unity - Asp.Net Web Api

    container.RegisterType<DbContext>(new PerRequestLifetimeManager());
    container.RegisterType<ISupplierRepository, SupplierRepository>();
    container.RegisterType<IContactRepository, ContactRepository>();
    

    【讨论】:

      猜你喜欢
      • 2015-03-23
      • 2014-01-30
      • 2017-03-18
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多