如何在第二个线程中实例化DBContext?

漫画队长

我最近偶然发现了一个事实,即我无法在单独的线程中使用相同的DBContext实例。我有两个共享相同DBContext的服务,所以最终出现异常

System.InvalidOperationException:'在上一个操作完成之前,第二个操作在此上下文上开始。这通常是由使用相同DbContext实例的不同线程引起的。有关如何避免DbContext线程问题的更多信息,请参见https://go.microsoft.com/fwlink/?linkid=2097913。

所以我的代码主要是由ASP.Net核心向导生成的

// program.cs

private static void ConfigureServices(string settings, IServiceCollection services)
{
  services.AddDbContext<MMCC.Terminal.Service.Data.TerminalDbContext>((provider, options) =>
{                options.UseNpgsql(configuration.GetConnectionString(nameof(TerminalDbContext)));
});
}

 public MyService1(TerminalDbContext dbTerminal)
        {
            _dbTerminal     = dbTerminal;
        }

 public MyService2(TerminalDbContext dbTerminal)
        {
            _dbTerminal     = dbTerminal;
        }

用法

void Run()
{
    _hourTimer  = new Timer(UpdateOnceInHour, null, 0, 60 * 60 * 1000);
    _minuteTimer = new Timer(UpdateEveryMinute,  null, 0,  1 * 60 * 1000);
}

private async void UpdateOnceInHour(object state)
{
 _mService1.DoSomething()
}

private async void UpdateOnceInHour(object state)
{
 _mService2.DoSomething()
}

所以这是我有例外的时候。

    // Service 1 
// thread 1
    private DoSomething()
    {
      await _dbTerminal.SomeTable1.ToListAsync();
    }
    
    // Service 2
// thread 2
    private DoSomething()
    {
      await _dbTerminal.SomeTable2.ToListAsync();
    }

我试图弄清楚如何解决这个问题。有什么标准图案吗?我尝试重构代码,而不是将TerminalDbContext注入Service1,Service2中,而是注入IServiceProvider,然后TerminalDbContextGetService但看来我最终还是使用相同的DBContext实例。

mister_smythers

您应该能够在需要唯一实例的任何地方使用using语句,并实例化一个新的上下文,该上下文将在完成后被处置。

using (var newContext = new TerminalDbContext(new DbContextOptionsBuilder<TerminalDbContext>()
{
    // Define options
}))
{
    DoSomething();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获得对在Objective-C中实例化第二个对象的对象的引用?

来自分类Dev

如何在Spring Boot应用程序中创建第二个RedisTemplate实例

来自分类Dev

如何在Java中返回子字符串的第二个实例?

来自分类Dev

ViewPager的第二个片段尚未实例化

来自分类Dev

如何在cli中访问倒数第二个命令的第二个参数?

来自分类Dev

如何在WPF的第二个屏幕中启动第二个应用程序?

来自分类Dev

如何关闭第二个UI线程

来自分类Dev

如何在编辑视图中的Rails(简单)form_for中添加第二个按钮以删除实例?

来自分类Dev

在第二个计划Dotnet中运行线程

来自分类Dev

如何创建jquery对象的第二个实例?

来自分类Dev

如何在字符串中提取整数值的第二个实例

来自分类Dev

识别第二个实例

来自分类Dev

Reg Expression-在javascript中如何获取第二个实例?

来自分类Dev

如何替换网址中字符的第二个实例?

来自分类Dev

如何在第二个引号处分开

来自分类Dev

如何在Chartjs中的插件中添加第二个功能?

来自分类Dev

如何在python中获取第二个LAN网络中的IP地址列表

来自分类Dev

米特。如何将线程中每个用户生成的变量传递给第二个线程用户?

来自分类Dev

如何从表中查找第二个值。

来自分类Dev

如何在另一个分区上运行Windows 7的第二个启动实例?

来自分类Dev

如何在div中设置第二个元素的样式

来自分类Dev

如何在熊猫df中插入第二个标题行以进行csv写入

来自分类Dev

如何在WPF中向第二个实体添加CRUD操作

来自分类Dev

如何在pyqt4中正确创建第二个窗口

来自分类Dev

如何在log4j中记录第二个参数

来自分类Dev

如何在第二个控制器中刷新数据

来自分类Dev

MYSQL:如何在单个查询中获取最大和第二个最大日期

来自分类Dev

如何在Ruby on Rails控制器中创建第二个create方法?

来自分类Dev

如何在Powershell中调用第二个窗口并对其进行写入

Related 相关文章

  1. 1

    如何获得对在Objective-C中实例化第二个对象的对象的引用?

  2. 2

    如何在Spring Boot应用程序中创建第二个RedisTemplate实例

  3. 3

    如何在Java中返回子字符串的第二个实例?

  4. 4

    ViewPager的第二个片段尚未实例化

  5. 5

    如何在cli中访问倒数第二个命令的第二个参数?

  6. 6

    如何在WPF的第二个屏幕中启动第二个应用程序?

  7. 7

    如何关闭第二个UI线程

  8. 8

    如何在编辑视图中的Rails(简单)form_for中添加第二个按钮以删除实例?

  9. 9

    在第二个计划Dotnet中运行线程

  10. 10

    如何创建jquery对象的第二个实例?

  11. 11

    如何在字符串中提取整数值的第二个实例

  12. 12

    识别第二个实例

  13. 13

    Reg Expression-在javascript中如何获取第二个实例?

  14. 14

    如何替换网址中字符的第二个实例?

  15. 15

    如何在第二个引号处分开

  16. 16

    如何在Chartjs中的插件中添加第二个功能?

  17. 17

    如何在python中获取第二个LAN网络中的IP地址列表

  18. 18

    米特。如何将线程中每个用户生成的变量传递给第二个线程用户?

  19. 19

    如何从表中查找第二个值。

  20. 20

    如何在另一个分区上运行Windows 7的第二个启动实例?

  21. 21

    如何在div中设置第二个元素的样式

  22. 22

    如何在熊猫df中插入第二个标题行以进行csv写入

  23. 23

    如何在WPF中向第二个实体添加CRUD操作

  24. 24

    如何在pyqt4中正确创建第二个窗口

  25. 25

    如何在log4j中记录第二个参数

  26. 26

    如何在第二个控制器中刷新数据

  27. 27

    MYSQL:如何在单个查询中获取最大和第二个最大日期

  28. 28

    如何在Ruby on Rails控制器中创建第二个create方法?

  29. 29

    如何在Powershell中调用第二个窗口并对其进行写入

热门标签

归档