You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:41:13