.NET Core中Hangfire使用Scoped DbContext出现已释放上下文错误求助
问题解决:Hangfire中DbContext已释放的异常
问题根源
你当前的代码里,serviceScope在using块结束后就会被释放,但Hangfire的任务是延迟执行的——不管是一次性任务还是定时任务。当任务真正运行时,你提前获取的jobService所依赖的Scoped DbContext已经跟着serviceScope被销毁,因此触发Cannot access a disposed context instance异常。
解决方案
不要在启动阶段的scope中提前解析Scoped服务,而是让Hangfire在任务执行时动态创建scope并获取服务,确保DbContext的生命周期与任务执行周期一致。
修改后的启动代码
// 启动时直接向Hangfire注册任务,传递根服务提供者 BackgroundJob.Enqueue(() => RunStartupJob(app.Services)); RecurringJob.AddOrUpdate("Receive Email Messages", () => RunRecurringJob(app.Services), "*/10 * * * * *");
新增任务执行方法
在启动类中添加以下静态方法,负责在任务执行时创建scope、获取服务并执行任务:
private static void RunStartupJob(IServiceProvider serviceProvider) { using var scope = serviceProvider.CreateScope(); var jobService = scope.ServiceProvider.GetRequiredService<ISystemStartupJobs>(); jobService.Run1(); } private static void RunRecurringJob(IServiceProvider serviceProvider) { using var scope = serviceProvider.CreateScope(); var jobService = scope.ServiceProvider.GetRequiredService<ISystemStartupJobs>(); jobService.Run2(); }
关键说明
- 每次任务执行时,都会创建一个新的
serviceScope,此时获取的ISystemStartupJobs和依赖的DbContext都是当前scope内的实例,生命周期覆盖整个任务执行过程。 - 确保你的DbContext依然保持Scoped注册(你已经完成这一步),这是上述方案生效的前提。
内容的提问来源于stack exchange,提问作者Alireza
相关产品推荐
相关产品推荐

