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

如何避免IIS进程休眠?Hangfire定时任务闲置停止问题求助

解决Hangfire定时任务在IIS闲置后停止的问题

检查并调整IIS应用池核心配置

  • 将应用池启动模式设为AlwaysRunning:仅设置空闲超时为0不足以维持持续运行,需在IIS管理器中找到对应应用池,右键进入「高级设置」,把启动模式从默认的OnDemand改为AlwaysRunning,这是让应用池常驻的关键配置。
  • 确认空闲超时为0:再次验证高级设置里的「空闲超时(分钟)」确实设为0,避免应用池因无请求被标记闲置后回收。
  • 禁用或调整定时回收:检查「固定时间间隔(分钟)」配置,若为非0值会定期强制回收应用池,建议改为0禁用定时回收,或根据业务需求调整到低峰时段。

强化Hangfire的持久化与恢复能力

  • 切换到持久化存储:如果当前使用MemoryStorage(内存存储),应用池回收后任务会全部丢失,必须改用SQL Server、Redis等持久化存储,示例配置:
    services.AddHangfire(config => config.UseSqlServerStorage("YourDatabaseConnectionString"));
    
  • 配置Hangfire Server的恢复策略:确保应用重启后能自动恢复未完成的任务,示例代码:
    services.AddHangfireServer(options =>
    {
        options.WorkerCount = Environment.ProcessorCount * 2;
        options.ServerName = "HangfireWorkerServer";
    });
    

开启IIS网站预加载

  • 在IIS管理器中找到对应网站,右键进入「管理网站」→「高级设置」,将「预加载已启用」设为True。这会让网站在应用池启动时就完成初始化,无需等待首次用户请求触发加载。

兜底的保活方案

  • 添加内部定时自我请求:如果以上配置仍有不稳定情况,可以在应用中新增一个简单的定时任务,每隔几分钟请求自身的空接口(比如/api/keepalive),避免应用被标记为闲置,示例代码:
    RecurringJob.AddOrUpdate("app-keepalive", () => SendKeepAliveRequest(), Cron.EveryMinute());
    
    private async Task SendKeepAliveRequest()
    {
        using var httpClient = new HttpClient();
        await httpClient.GetAsync("http://your-app-domain/api/keepalive");
    }
    
  • 检查服务器电源计划:确保服务器设置为「高性能」模式,避免系统因节能策略休眠或关闭相关服务。

内容的提问来源于stack exchange,提问作者Mahmoud Talaat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:14:54