创建报告时,我必须执行 3 个涉及相同上下文的独立实体的查询。因为它们很重,所以我决定使用.ToListAsync();
为了让它们并行运行,但是,令我惊讶的是,我得到了一个例外......
使用 EF 6 并行执行查询的正确方法是什么?我应该手动启动新任务吗?
Edit 1
代码基本上是
using(var MyCtx = new MyCtx())
{
var r1 = MyCtx.E1.Where(bla bla bla).ToListAsync();
var r2 = MyCtx.E2.Where(ble ble ble).ToListAsync();
var r3 = MyCtx.E3.Where(ble ble ble).ToListAsync();
Task.WhenAll(r1,r2,r3);
DoSomething(r1.Result, r2.Result, r3.Result);
}
问题是这样的:
EF 不支持通过同一 DbContext 对象处理多个请求。如果同一 DbContext 实例上的第二个异步请求在第一个请求完成之前启动(这就是重点),您将收到一条错误消息,表明您的请求正在针对打开的 DataReader 进行处理。
Source: https://visualstudiomagazine.com/articles/2014/04/01/async-processing.aspx
您需要将代码修改为如下所示:
async Task<List<E1Entity>> GetE1Data()
{
using(var MyCtx = new MyCtx())
{
return await MyCtx.E1.Where(bla bla bla).ToListAsync();
}
}
async Task<List<E2Entity>> GetE2Data()
{
using(var MyCtx = new MyCtx())
{
return await MyCtx.E2.Where(bla bla bla).ToListAsync();
}
}
async Task DoSomething()
{
var t1 = GetE1Data();
var t2 = GetE2Data();
await Task.WhenAll(t1,t2);
DoSomething(t1.Result, t2.Result);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)