2009-02-25 11 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

+0

非常に良い点。その場合、私はサービスインスタンスをスレッドに渡すことを提案したり、別のポスターを提案してシングルトンにしたりすることをお勧めします。 –

関連する問題