Visual Studio调试时BackgroundService为何会被取消?
问题根源:调试服务器的闲置超时回收
- 你遇到的
OperationCanceledException确实是Visual Studio调试用的Web服务器(IIS Express或Kestrel调试模式)导致的。这类服务器默认有10分钟的闲置超时规则——当应用连续10分钟没有收到任何HTTP请求时,服务器会自动回收应用进程,释放资源。 - 进程回收时,ASP.NET Core会触发BackgroundService的停止逻辑,传入的
stoppingToken会被置为取消状态。而你的代码里await _queue.PullAsync(stoppingToken)正处于等待Channel消息的阻塞状态,令牌取消会直接抛出这个取消异常。
验证方法
- 调试时每隔几分钟手动给应用发个HTTP请求,比如访问首页,如果不再抛出异常,就实锤是闲置超时的问题。
- 查看IIS Express的配置文件(路径一般是
%userprofile%\Documents\IISExpress\config\applicationhost.config),找到对应应用池的idleTimeout属性,默认值就是00:10:00,和你遇到的时间点完全匹配。
调试阶段的临时解决办法
- 修改IIS Express的闲置超时:打开上述配置文件,把目标应用池的
idleTimeout改成更大的值(比如01:00:00),或者设为00:00:00直接禁用超时(注意:生产环境别这么干,会浪费资源)。 - 保持应用活跃:写个简单的脚本,每隔几分钟自动给应用发个请求,避免触发回收机制。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

