Entity Framework是否支持并行异步查询?

usr*_*usr 51 .net entity-framework entity-framework-6

当我们启动多个异步实体框架查询并并行运行时会发生什么

他们是否并行执行?它们是否由实体框架序列化?这不受支持吗?它会导致异常吗?

public async Task QueryDatabase()
{
    using (var context = new MyDbContext())
    {
        Task task1 = context.SomeTable1.ToListAsync();
        Task task2 = context.SomeTable2.ToListAsync();

        await Task.WhenAll(task1, task2);
    }
}
Run Code Online (Sandbox Code Playgroud)

ken*_*n2k 62

根据版本6规范,不支持此功能.

这应该抛出DbConcurrencyException异常说法

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

EF将检测开发人员是否尝试同时执行两个异步操作并抛出.

项目的codeplex页面:

启用数据库操作的异步执行实际上与在同一上下文中启用并发执行是正交的.在服务器方案的特定情况下,使用并发访问会对可伸缩性产生负面影响,因为这意味着为了处理单个请求,您将旋转任意数量的不同线程.所有线程都会争夺内存等资源与服务其他并发请求所需的其他线程.

  • 尽管我希望我可以为编写Codeplex片段的人提供帮助,但仍需要提高准确度.一个好的查询几乎完全是db的命中,在大多数情况下,它是多CPU并且在许多情况下是联网的.向数据库抛出一堆并行异步调用使用NO线程!http://blog.stephencleary.com/2013/11/there-is-no-thread.html如果所有查询都是.AsNoTracking(),那么EF支持这一点应该是微不足道的,但它仍会抛出此异常. (5认同)
  • @MIKE好吧****是异步的; 它只是你不能并行运行多个异步SQL操作.异步编程在服务器端有许多优点:第一个是_not_更好的性能,它是_scalability_,这意味着在操作完成之前你不会阻塞线程.即使你不能并行运行两个SQL请求,它仍然是一个很大的优势.例如,请参见http://stackoverflow.com/a/12673868 (5认同)

jkr*_*r01 5

请注意,正如 ken2k 所提到的,当将实体框架与 MS SQL Server 一起使用时,这是不允许的。但是,如果您将 Entity Framework 与 Oracle 一起使用,则这是允许的。

  • 手指交叉你的寻呼机在晚上不会响。感谢您报告此事。 (6认同)
  • 你能给出一个来源吗?我的印象是 EF 内部无法同时运行多个查询。这将要求其内部结构(例如身份映射)是线程安全的。 (5认同)
  • 我不能给出一个来源,我只能说我在生产中运行了使用该方法的代码。 (2认同)