2009-02-25 79 views
8

我有一個啓動OnStart方法中的線程的Windows服務。如何從線程停止Windows服務應用程序?

基本上我希望能夠停止服務,如果事情真的發生錯誤(如未處理的異常)。

目前我使用的是ServiceBase.Stop(),但涉及到ServiceBase實例在線程可見的地方,這反過來涉及在主程序中聲明我的實例爲public static

有什麼「更好的方法」來停止服務?如果不是......這樣做是否安全?

回答

10

最簡單的,在我看來,最徹底的方法是使用服務類的公共靜態屬性。唯一不行的是,如果你使用相同的服務類在同一個進程中運行多個服務,那是非常罕見的。

private static MyService m_ServiceInstance; 

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

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

注射服務實例到每一個可能需要的是一個選擇,但它可以迅速變得混亂,它只是使用靜態屬性上有沒有真正的優勢方法。

0

查看關於如何使用ServiceController類來啓動和停止服務的example here

或者,您可以在創建服務實例時將該服務實例傳遞給該線程(或將其設置爲線程類中的實例變量等),而無需將服務類設爲靜態。

的完整性簡單例子:

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

我不認爲這是明智的假設(在所有情況下)您的服務帳戶將有權訪問服務控制管理器,這是ServiceController使用的。這是你用來從外部控制一個過程,而不是一個好的解決方案IMO,從內部。 – jlew 2009-02-25 18:13:54

相關問題