【问题标题】:How do I stop a windows service application from a thread?如何从线程中停止 Windows 服务应用程序?
【发布时间】:2009-02-25 17:47:30
【问题描述】:

我有一个 Windows 服务,它在 OnStart 方法中启动一个线程。

基本上,如果出现问题(例如未处理的异常),我希望能够停止服务。

目前我正在使用ServiceBase.Stop(),但这涉及到在某个线程可见的某个地方有一个ServiceBase实例,这反过来又涉及在主程序中将我的实例声明为public static。

有没有“更好的方法”来停止服务?如果不是……这样做安全吗?

【问题讨论】:

    标签: c# .net multithreading windows-services


    【解决方案1】:

    在我看来,最简单且最简洁的方法是使用服务类的公共静态属性。唯一不起作用的情况是,如果您使用同一个服务类在同一个进程中运行多个服务,这种情况非常罕见。

    private static MyService m_ServiceInstance;
    
    public static MyService ServiceInstance
    {
        get { return m_ServiceInstance; }
    }
    
    public MyService()
    {
        InitializeComponents();
        //Other initialization
        m_ServiceInstance = this;
    }
    

    将服务实例注入每个可能需要它的方法是一种替代方法,但它很快就会变得混乱,并且与仅使用静态属性相比没有真正的优势。

    【讨论】:

      【解决方案2】:

      查看example here,了解如何使用 ServiceController 类来启动和停止服务。

      或者,您可以在创建服务实例时将其传递给线程(或将其设置为线程类中的实例变量等),而无需将服务类设为静态。

      完整性的简短示例:

      ServiceController sc = new ServiceController("MyService");
      sc.Stop();
      

      【讨论】:

      • 我认为假设(在所有情况下)您的服务帐户将有权访问 ServiceController 使用的服务控制管理器是不明智的。这是您用来从外部控制流程的方法,而不是从内部控制 IMO 的好方法。
      • 非常好。在这种情况下,我建议将服务实例传递给线程,或者按照另一位发帖人的建议,将其设为单例。
      猜你喜欢
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2010-12-04
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多