运行使用EF Core的并行异步任务时出现异常

时间:2017-04-06 08:55:59

标签: c# dependency-injection asp.net-core async-await entity-framework-core

我试图了解如何在将db上下文注入到类中时处理使用实体框架的并行异步任务。

我有一个显示多个总计的仪表板,我尝试做的是运行并行返回这些总计的方法。目前我有一些看起来像这样的代码:

Task.WaitAll

当我运行该代码时,我从sentence = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY" s = sentence.split() positions = [s.index(x)+1 for x in s] my_list = ['ASK', 'NOT', 'WHAT', 'YOUR', 'COUNTRY', 'CAN', 'DO', 'FOR', 'YOU', 'ASK', 'WHAT', 'YOU', 'CAN', 'DO', 'FOR', 'YOUR', 'COUNTRY'] unique = [] [unique.append(item) for item in my_list if item not in unique] print("The sentence",sentence,"contains the words",unique) print("It can be recreated from the positions of the words in this list",s,"using the sequence",positions) 行收到此错误:

  

InvalidOperationException:未关闭连接。该   连接的当前状态正在连接。

some reading之后我意识到Entity Framework is not thread safe,所以,我猜测造成异常的原因是我的每项任务都在运行,所有这些都是使用相同的上下文实例并导致EF引发异常?

因此,解决方案似乎是为每个任务创建一个新的上下文实例,但是我使用依赖注入,所以默认情况下我的上下文实例的范围是服务器请求的生命周期(我认为)

那么,上述理解是否正确,如果是这样,是为每个任务获取新上下文而不是重用现有任务的解决方案?我该怎么做?

1 个答案:

答案 0 :(得分:3)

我添加了一个工厂类来创建我的上下文的新实例:

   public class KpiContextFactory: IKpiContextFactory
    {
        private string _connection = @"Server=.\SQL2008EXP;Database=kpiDb;Trusted_Connection=True;";

        public KpiContext GetNewContext()
        {
            var optionsBuilder = new DbContextOptionsBuilder<KpiContext>();
            optionsBuilder.UseSqlServer(_connection);

            return new KpiContext(optionsBuilder.Options);
        }
    }

现在我只是注入该工厂而不是上下文本身,然后调用_kpiContextFactory.GetNewContext().[method]而不是_context.[method]。这似乎工作正常。