我可能没想到正确的方向.我是Dependency Injection和ASP.Net Core的新手.
我有一个ASP.Net核心网站,其中一个任务是将数据从Excel工作表导入用户将上传的数据库. excel表格可能很大,数据转换任务需要时间,因此我希望在后台执行它们.即用户将上传工作表,响应将立即发送,后台作业/线程将导入数据.
我试图通过以下方式运行后台工作:
Task.Run(() => ProcessImport(model));
我遇到的问题是Process导入方法调用具有存储库类的服务,该存储库类通过作为Scoped添加的ASP.Net依赖注入容器访问AppDbContext,并且一旦响应被发回,则处理上下文.我得到一个运行时异常,你不能在它被处置后使用上下文.
我的问题是,处理这种情况的最佳方法是什么?我应该制作AppDbContext单例吗?我应该在ProcessImport方法中创建一个新的AppDbContext实例,并将其传递给它吗?我读过DbContext不是线程安全的,所以这是一个好方法吗?
您应该将IServiceScopeFactory实例(它的单例)传递给您的任务.
在内部任务中,当数据到达时,您应该创建新的CreateScope()并从该范围请求服务.当数据处理完成时 – 处置此范围(但是对下一次运行保持对IServiceScopeFactory的引用).
例如,请参见this.我用这个库运行小而快的任务.
对于重型/长期运行的任务,正如Gert所写,不要依赖于您的任务将始终运行完成.准备好重新启动,准备好重新处理相同的数据.