我有一个用 .NET 3.5 (c#) 编写的 Windows 服务,它带有一个 System.Threading.Timer,它在每个回调中生成多个线程。这些只是普通线程(没有线程池),我已经在每个线程上设置了IsBackground = true,因为我只会运行托管代码。
当用户停止服务时,所有线程会发生什么?他们会优雅地死去吗?我没有任何通过调用加入或中止来管理线程的代码。假设IsBackground = true是否足以假设当用户停止服务时线程将被释放和停止?当有人通过 Service Manager GUI 停止 Windows 服务时,究竟会发生什么?它会在触发 OnStop 事件后终止进程吗?
这对我来说实际上是可以接受的,因为我已经建立了一个单独的机制,允许用户在停止服务之前确定没有线程。这是通过从在 Windows 服务内运行的 ServiceHost 公开的 2 个 WCF 方法完成的。有一种方法可以停止产生新线程,另一种方法可以查询剩余多少正在运行的线程。
我只是好奇如果他们跳过这些步骤并停止服务会发生什么......似乎 IsBackground 有助于实现这一点: