【问题标题】:How to stop a windows service that has multiple threads cannot be stopped如何停止具有多个线程的 Windows 服务无法停止
【发布时间】:2012-11-20 18:45:03
【问题描述】:

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

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

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

现在我很困惑在不触及遗留代码的情况下应该在短时间内做什么。任何帮助都将不胜感激。

【问题讨论】:

    标签: c# windows service servicecontroller


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多