关闭具有线程的Windows服务

时间:2010-05-08 17:07:43

标签: wcf windows-services multithreading isbackground

我有一个用.NET 3.5(c#)编写的Windows服务,其中包含System.Threading.Timer,它在每个回调中产生多个线程。这些只是普通线程(没有线程池),我在每个线程上都设置了IsBackground = true,因为我只会运行托管代码。

当用户停止服务时,所有线程会发生什么?他们优雅地死了吗?我没有任何代码通过调用join或abort来管理线程。假设IsBackground = true足以假设线程将在用户停止服务时被处理和停止,这是正确的吗?当有人通过Service Manager GUI停止Windows服务时会发生什么?它会在触发OnStop事件后终止进程吗?

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

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

1 个答案:

答案 0 :(得分:6)

从您提供的MSDN链接:

  

线程是后台线程或前台线程。后台线程与前台线程相同,除了后台线程不会阻止进程终止。一旦属于进程的所有前台线程终止,公共语言运行库就结束该进程。 任何剩余的后台线程都已停止且未完成。

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

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