我可能没有朝着正确的方向思考。我对依赖注入(inject)和 ASP.Net Core 相当陌生。
我有一个 ASP.Net 核心网站,其中一项任务是将数据从 Excel 工作表导入用户将上传的数据库。 excel表格可能很大,数据转换任务很耗时,因此我希望在后台执行它们。即用户将上传工作表,将立即发送响应,后台作业/线程将导入数据。
我正在尝试通过以下方式运行后台作业:
Task.Run(() => ProcessImport(model));
我遇到的问题是 Process 导入方法调用具有存储库类的服务,这些服务通过作为 Scoped 添加的 ASP.Net Dependency Injection Container 访问 AppDbContext ,并且一旦发送回响应,上下文就会被处理掉。我收到一个运行时异常,您在处理完上下文后无法使用它。我的问题是,处理这种情况的最佳方法是什么?我应该使 AppDbContext 单例吗?我应该在 ProcessImport 方法中创建一个新的 AppDbContext 实例并将其传递吗?我读过 DbContext 不是线程安全的,那么这是一个好方法吗?
最佳答案
你应该通过 IServiceScopeFactory
实例(它是单例)到您的任务中。
内部任务,当数据到达时,您应该创建新的CreateScope()
并从该范围请求服务。当数据处理完成时 - 处理这个范围(但保留对 IServiceScopeFactory
的引用以供下次运行)。
见 this例如。我用这个库运行小而快的任务。
正如 Gert 所写,对于繁重/长时间运行的任务,不要依赖于您的任务将始终运行完成。准备好重新启动,准备好重新处理相同的数据。
关于dependency-injection - 通过依赖注入(inject)实现后台任务的 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39109234/