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

ASP.NET后台长运行线程在IIS中被终止的原因及解决方案

问题根源与解决方案

问题确认

是IIS导致的线程终止。IIS的应用程序池回收机制会定期终止整个应用进程(默认固定间隔1740分钟,也可能因空闲超时、资源阈值触发),进程终止时所有线程都会被强制中止,就会出现Thread was being aborted错误。你的后台线程标记为Background=true,进程终止时会直接被销毁,无法存活。

解决方案

方案1:调整IIS应用程序池配置,减少回收触发

  • 关闭固定时间回收:打开IIS管理器,找到对应应用程序池→高级设置→回收,取消勾选「固定时间间隔(分钟)」。
  • 延长空闲超时:在高级设置→进程模型中,将「空闲超时(分钟)」设为极大值(如14400,即10天),或设为0表示永不因空闲回收。
  • 设置启动模式为「AlwaysRunning」:同样在进程模型中,将「启动模式」改为AlwaysRunning,IIS会保持进程持续运行,即使没有HTTP请求。
  • 禁用资源触发回收:如果是内存/CPU阈值触发的回收,可在回收选项中取消对应阈值的勾选,或调高阈值。

方案2:将Socket监听逻辑迁移至独立服务(推荐)

ASP.NET应用的设计目标是处理HTTP请求,不适合长期运行的后台任务。最可靠的方式是把Socket监听部分做成Windows服务(.NET Framework可直接创建Windows Service项目):

  • Windows服务是独立于IIS的系统进程,不受IIS回收机制影响,能稳定运行数年。
  • 服务与ASP.NET MVC应用间可通过SignalR、数据库或本地消息队列通信,实现数据同步和进程监控。

方案3:使用后台任务框架(次选)

如果暂时不想迁移到Windows服务,可使用Hangfire(支持.NET Framework)管理后台任务:

  • Hangfire能在应用程序池回收后自动重启任务,一定程度上保证监听逻辑的持续性。
  • 但Hangfire仍依赖ASP.NET进程,若IIS强制回收,任务仍会短暂中断,可靠性不如独立服务。

额外注意事项

  • 不要在ASP.NET中手动创建后台线程:ASP.NET运行时会管理线程池,手动线程不受控制,易引发资源泄漏或意外终止。
  • 即使调整IIS配置,仍可能因服务器重启、应用崩溃等原因导致进程终止,因此独立服务是长时任务的最优选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:46:07