我有一個啓動OnStart方法中的線程的Windows服務。如何從線程停止Windows服務應用程序?
基本上我希望能夠停止服務,如果事情真的發生錯誤(如未處理的異常)。
目前我使用的是ServiceBase.Stop()
,但涉及到ServiceBase
實例在線程可見的地方,這反過來涉及在主程序中聲明我的實例爲public static
。
有什麼「更好的方法」來停止服務?如果不是......這樣做是否安全?
我有一個啓動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