2012-11-20 103 views
1

我有一个用C#编写的用于创建多个线程的Windows服务,某些线程具有遗留代码,并且我没有足够的时间/访问遗留代码来等待所有这些线程在OnStop()完成之前停止。再次在某些时候,我没有引用所有线程,因为有遗留代码。现在我想动态更新服务。所以我从我的工作服务开始一个不同的更新程序服务。更新程序服务将停止作业服务,下载作业服务exe和其他dll,将其替换为旧的exe文件和dll,最后重新启动作业服务。开始后,作业服务将停止更新程序服务。如何停止具有多个线程的Windows服务无法停止

现在,当Updater服务使用ServiceController.Stop()停止Job服务并调用ServiceController.WaitForStatus(ServiceControllerStatus.Stopped)时,Job服务停止,但从Job服务产生的一些遗留线程可能不会停止那一刻,并因此Job Service exe无法更新。

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

现在我很困惑在短时间内应该做什么而不触摸遗留代码。任何帮助将是可观的。

回答

1

如果你可以开始与thread.IsBackground = true线程,这将是可以自动打断他们,当所有前台线程完成处理(例如,您的Stop法)