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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:57:30