如何避免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
相关产品推荐
相关产品推荐

