Hangfire中Recurring Job未触发问题排查求助
问题分析与解决方案
你的问题核心在于BackgroundJobServer被包裹在using块中,当代码执行完using块的逻辑后,服务器实例会被自动释放(Dispose),导致Hangfire服务器无法持续运行来轮询并触发你的定时任务。
为什么BackgroundJob能正常执行?
BackgroundJob.Enqueue是立即执行的任务,在using块内服务器还存活的短暂时间里就已经被处理完成了;但RecurringJob需要Hangfire服务器持续运行,不断检查数据库中的定时任务配置,到时间才会触发执行——服务器一旦被释放,自然没法完成后续的轮询工作。
修正方案
你需要让BackgroundJobServer实例在应用的整个生命周期内保持存活,而不是执行完就释放。比如在ASP.NET Core应用中,通常会把它注册为单例服务,或者在应用启动后保持服务器运行直到应用停止。
修正后的代码示例:
// 不要用using包裹,保留服务器实例让它持续运行 var server = new BackgroundJobServer(serverOptions, storage); Log("Hangfire server started"); try { RecurringJob.AddOrUpdate( "Mail", () => _notificationHelper.SendEmail(result), Cron.MinuteInterval(1), TimeZoneInfo.Local ); } catch (Exception ex) { // 处理添加定时任务时的异常 Log($"Failed to add recurring job: {ex.Message}"); } // 在应用关闭时手动释放服务器(比如在ASP.NET Core的HostedService中处理,或者控制台应用的退出事件里) // 比如控制台应用可以这样: Console.CancelKeyPress += (sender, e) => { server.Dispose(); Log("Hangfire server stopped"); };
额外检查点
- 确认你的Hangfire存储配置正确(比如数据库连接字符串、权限等),既然你说数据库中已经有任务数据,这部分应该没问题,但还是可以再验证下存储的健康状态。
- 确保应用有足够的权限来持续运行Hangfire服务器,没有被操作系统或宿主环境强制终止。
内容的提问来源于stack exchange,提问作者jck
相关产品推荐
相关产品推荐

