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

时间:2009-02-25 17:47:30

标签: c# .net multithreading windows-services

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

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

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

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

2 个答案:

答案 0 :(得分:10)

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

private static MyService m_ServiceInstance;

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

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

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

答案 1 :(得分:0)

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

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

完整性的简短示例:

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