当我们启动多个异步实体框架查询并且并行运行它们时会发生什么?
他们是否并行执行?它们是否由实体框架序列化?这不受支持吗?它会导致异常吗?
public async Task QueryDatabase()
{
using (var context = new MyDbContext())
{
Task task1 = context.SomeTable1.ToListAsync();
Task task2 = context.SomeTable2.ToListAsync();
await Task.WhenAll(task1, task2);
}
}
答案 0 :(得分:59)
根据specifications of version 6不支持此功能。
这应该抛出一个DbConcurrencyException
例外
在此上下文之前的第二个操作开始 异步操作已完成。使用'等待'确保任何 在调用另一个方法之前已完成异步操作 在这种背景下。任何实例成员都不能保证是线程 安全
如果开发人员一次尝试执行两次异步操作并抛出,则EF将检测。
来自a codeplex page of the project:
实际上是启用数据库操作的异步执行 正交以在同一上下文中启用并发执行。在 服务器场景的特殊情况,使用并发访问可以 影响可伸缩性,因为它意味着为了 处理单个请求,您将旋转任意数字 不同的线程。所有线程都会争夺资源 作为服务器其他并发所需的其他线程的内存 请求。
答案 1 :(得分:2)
正如ken2k所提到的那样,当使用实体框架与MS SQL Server时,这是不允许的。但是,如果您将实体框架与Oracle一起使用,则允许这样做。
答案 2 :(得分:0)
只是想用 EF 5 更新它,现在可以拆分在单独查询中加载导航属性的查询: https://docs.microsoft.com/en-us/ef/core/querying/single-split-queries
仍然无法解决您的问题,但了解一下可能会有所帮助。