EF 6 - 如何正确执行并行查询 [英] EF 6 - How to correctly perform parallel queries

查看:23
本文介绍了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>获取E1Data(){使用(var MyCtx = new MyCtx()){返回等待 MyCtx.E1.Where(bla bla bla).ToListAsync();}}异步任务<列表>获取E2Data(){使用(var MyCtx = new MyCtx()){返回等待 MyCtx.E2.Where(bla bla bla).ToListAsync();}}异步任务 DoSomething(){var t1 = GetE1Data();var t2 = GetE2Data();等待 Task.WhenAll(t1,t2);DoSomething(t1.Result, t2.Result);}

When creating a report I have to execute 3 queries that involve separated entities of the same context. Because they are quite heavy ones I decided to use the .ToListAsync(); in order to have them run in parallel, but, to my surprise, I get a exception out of it...

What is the correct way to perform queries in parallel using EF 6? Should I manually start new Tasks?

Edit 1
The code is basically

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);
}

解决方案

The problem is this:

EF doesn't support processing multiple requests through the same DbContext object. If your second asynchronous request on the same DbContext instance starts before the first request finishes (and that's the whole point), you'll get an error message that your request is processing against an open DataReader.

Source: https://visualstudiomagazine.com/articles/2014/04/01/async-processing.aspx

You will need to modify your code to something like this:

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);
}

这篇关于EF 6 - 如何正确执行并行查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆