entity framework是否支持并行asynchronous查询?
当我们启动多个asynchronousentity framework查询并同时运行它们时会发生什么?
他们是在物理上并行执行吗? 他们是由entity framework序列化? 这是不受支持的? 这是否会导致exception?
public async Task QueryDatabase() { using (var context = new MyDbContext()) { Task task1 = context.SomeTable1.ToListAsync(); Task task2 = context.SomeTable2.ToListAsync(); await Task.WhenAll(task1, task2); } }
根据版本6的规格,这不被支持。
这应该抛出一个DbConcurrencyException
exception说
在上一次asynchronous操作完成之前,在此上下文中开始第二个操作。 在调用另一个方法之前,使用“await”来确保任何asynchronous操作已经完成。 任何实例成员不保证是线程安全的。
EF会检测开发者是否试图一次执行两个asynchronous操作并抛出 。
从项目的codeplex页面 :
实现数据库操作的asynchronous执行实际上与在同一个上下文中启用并发执行是正交的。 在服务器场景的特殊情况下,使用并发访问可能会影响可伸缩性,因为这意味着为了处理单个请求,您将旋转任意数量的不同线程。 所有的线程都会争夺资源,比如与其他线程一起服务其他并发请求的内存。
就像ken2k提到的那样,在MS SQL Server中使用entity framework时,这是不允许的。 但是,如果您在Oracle中使用entity framework,则允许这样做。