Wcf 正在关闭具有线程的windows服务

Wcf 正在关闭具有线程的windows服务,wcf,windows-services,multithreading,isbackground,Wcf,Windows Services,Multithreading,Isbackground,我有一个用.NET3.5(c#)编写的windows服务,它有一个System.Threading.Timer,在每个回调中生成几个线程。这些只是普通线程(没有线程池),我在每个线程上都设置了,因为我只运行托管代码 当用户停止服务时,所有线程会发生什么情况?他们死得优雅吗?我没有任何代码通过调用join或abort来管理线程。假设当用户停止服务时线程将被释放和停止,这是否正确?当有人通过service Manager GUI停止windows服务时,会发生什么情况?它是否在触发OnStop事件后

我有一个用.NET3.5(c#)编写的windows服务,它有一个System.Threading.Timer,在每个回调中生成几个线程。这些只是普通线程(没有线程池),我在每个线程上都设置了,因为我只运行托管代码

当用户停止服务时,所有线程会发生什么情况?他们死得优雅吗?我没有任何代码通过调用join或abort来管理线程。假设当用户停止服务时线程将被释放和停止,这是否正确?当有人通过service Manager GUI停止windows服务时,会发生什么情况?它是否在触发OnStop事件后终止进程

这实际上对我来说是可以接受的,因为我构建了一个单独的机制,允许用户在停止服务之前确定没有线程。这是通过从Windows服务内部运行的ServiceHost中公开的2个WCF方法完成的。有一种方法可以停止生成新线程,另一种方法可以查询剩余的运行线程数


我只是好奇如果他们跳过这些步骤,停止服务会发生什么。。。IsBackground似乎有助于实现这一点:

从您提供的MSDN链接:

线程可以是背景线程,也可以是前景线程。后台线程与前台线程相同,只是后台线程不阻止进程终止。一旦属于某个进程的所有前台线程都终止,公共语言运行库就会结束该进程所有剩余的后台线程都已停止且未完成。

将线程的
IsBackground
属性设置为
true
将允许Windows服务在
OnStop()
回调完成且所有前台线程(如果有)退出后立即终止。后台线程将在其执行状态下停止,因此如果这些线程需要正常终止,则需要使用不同的机制

一种方法是使用前台线程来检查发出关闭线程信号的
ManualResetEvent
对象。在
OnStop()
回调中,设置
ManualResetEvent
,然后使用
Join()
等待线程退出。如果它们没有在合理的时间内退出,您可以强制终止它们,因为进程正在退出