如何停止具有多个线程的Windows服务无法停止

时间:2012-11-20 18:45:04

标签: c# windows service servicecontroller

我有一个用C#编写的Windows服务创建多个线程,一些线程有遗留代码,我没有足够的时间/访问遗留代码来等待所有这些线程在OnStop()完成之前停止。在某些时候,我没有引用所有线程,因为有遗留代码。现在我想动态更新服务。所以我从我的Job服务启动了一个不同的Updater服务。 Updater服务将停止作业服务,下载作业服务exe和其他dll,用旧服务exe和dll替换它们,最后将重新启动作业服务。启动后,作业服务将停止Updater服务。

现在,当Updater服务使用ServiceController.Stop()停止作业服务,并且还调用ServiceController.WaitForStatus(ServiceControllerStatus.Stopped)时,作业服务停止,但是从作业服务生成的一些旧版线程可能无法停止那一刻,因此无法更新Job Service exe。

我真的找不到任何好的解决方案。最好的解决方案可能是使用WaitHandles(AutoResetEvent / ManualResetEvent)来等待所有线程完成,这不会发生。或者可能是所有线程都被强制中止,这似乎也很关键。另一个不受欢迎的解决方案可能是找到在服务进程中运行的所有线程,并终止/中止所有线程,这些线程并不简单,也根本不是一个优选的解决方案。我希望在OnStop()中使用Environment.Exit,但发现它会导致Windows显示一条错误的警告消息,说明进程意外终止(错误1067),我根本无法解决。

现在我很困惑在短时间内应该做什么而不触及遗留代码。任何帮助都会很明显。

1 个答案:

答案 0 :(得分:1)

如果您可以使用thread.IsBackground = true启动线程,则可以在所有前台线程完成处理时自动中断它们(例如,您的Stop方法)