EF 6 – 如何正确执行并行查询

在创建报告时,我必须执行3个涉及相同上下文的分离实体的查询。 因为它们很重,我决定使用.ToListAsync(); 为了让它们并行运行,但令我惊讶的是,我得到了一个例外…

使用EF 6并行执行查询的正确方法是什么? 我应该手动启动新任务吗?

编辑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。

资料来源: https : //visualstudiomagazine.com/articles/2014/04/01/async-processing.aspx

您需要将代码修改为以下内容:

 async Task> GetE1Data() { using(var MyCtx = new MyCtx()) { return await MyCtx.E1.Where(bla bla bla).ToListAsync(); } } async Task> 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(r1.Result, r2.Result); }