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