如何从线程停止Windows服务应用程序?

问题描述:

我有一个启动OnStart方法中的线程的Windows服务。如何从线程停止Windows服务应用程序?

基本上我希望能够停止服务,如果事情真的发生错误(如未处理的异常)。

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

有什么“更好的方法”来停止服务?如果不是......这样做是否安全?

最简单的,在我看来,最彻底的方法是使用服务类的公共静态属性。唯一不行的是,如果你使用相同的服务类在同一个进程中运行多个服务,那是非常罕见的。

private static MyService m_ServiceInstance; 

public static MyService ServiceInstance 
{ 
    get { return m_ServiceInstance; } 
} 

public MyService() 
{ 
    InitializeComponents(); 
    //Other initialization 
    m_ServiceInstance = this; 
} 

注射服务实例到每一个可能需要的是一个选择,但它可以迅速变得混乱,它只是使用静态属性上有没有真正的优势方法。

查看关于如何使用ServiceController类来启动和停止服务的example here

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

的完整性简单例子:

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

我不认为这是明智的假设(在所有情况下)您的服务帐户将有权访问服务控制管理器,这是ServiceController使用的。这是你用来从外部控制一个过程,而不是一个好的解决方案IMO,从内部。 – jlew 2009-02-25 18:13:54