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

How to update database from another thread

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

我收到以下错误:

System.ObjectDisposedException:“无法访问已处置的对象。导致此错误的一个常见原因是处置从依赖注入解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。这如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生。如果您正在使用依赖注入,则应该让依赖注入容器处理上下文实例。 “

原因是我的主线程在 backgroundworker 完成之前已经 returns 一个 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 了吗?那一个谈论在内部实现微服务。这允许在这些托管服务上使用依赖注入。