如何从另一个线程更新数据库

问题描述

在我的Asp.net Core项目中,我正在使用Backgroundworker进行非常耗时的过程。工作人员完成后,我想更新数据库。通过依赖性注入来注入与数据库的连接。

我收到以下错误

System.ObjectdisposedException:“无法访问已处置的对象。此错误的常见原因是处置从依赖项注入中解决的上下文,然后稍后尝试在应用程序中的其他位置使用相同的上下文实例。如果您在上下文上调用dispose()或将上下文包装在using语句中如果使用依赖注入,则应让依赖注入容器来处理上下文实例。 “

原因是我的主线程在后台工作人员完成之前已返回ActionResult,并且应该以这种方式完成。但是与数据库的连接已被清除。

现在是否有一种方法可以防止依赖项注入的处理?

我已经尝试克隆数据库连接,但是遇到相同的错误

解决方法

不。恭喜您发现了一种使用依赖注入来获取数据库连接的情况。期。这是流程设计的一部分-ASP:nET Core中的DI与请求的生存期相关,而后台工作人员...则与之无关。选择?

  • 直接从DI询问单独的数据库连接。
  • 启动另一个内部请求,以便DI堆栈针对该请求运行。从asp.net堆栈的角度来看,该命令可以同步运行,因此DI不会对其进行处理。
  • 还有一种获取数据库连接对象的替代方法,而无需使用asp.net核心用于页面生存期访问的DI机制。

没有办法避免处理,因为这基本上是一个基本方案。可以在请求后进行清理。

您读过https://docs.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/background-tasks-with-ihostedservice吗?那是关于内部实现微服务的话题。这样就可以在这些托管服务上使用依赖项注入。