Windowsサービスのプログラミングについて:Windowsサービスを停止する方法は?
これは非常に単純化されたサンプルコード(C#)です。
// Here is my service class (MyTestService.cs).
public class MyTestService:ServiceBase{
// Constructor.
public MyTestService(){
this.ServiceName = "My Test Service";
return;
}
};
// My application class (ApplicationClass.cs).
public static class ApplicationClass{
// Here is main Main() method.
public static void Main(){
// 1. Creating a service instance
// and running it using ServiceBase.
MyTestService service = new MyTestService();
ServiceBase.Run(service);
// 2. Performing a test shutdown of a service.
service.Stop();
Environment.Exit(0);
return;
};
};
そのため、「My Test Service」を作成し、それを開始して停止しました。しかし、Services.mscを調べているとき、「私のテストサービス」は実行を続け、「停止」リンクをクリックしたときにのみ停止します。どうして? -なぜservice.Stop()コマンドは何もしませんか?
ServiceController.Stop()も何もしません!
Main()メソッドからサービスを停止するにはどうすればよいですか?
Stop
-関数は停止信号を送信します。信号を受信して処理するまで待機しません。
Stop-signalが機能するまで待つ必要があります。あなたはWaitForStatus
を呼び出すことでそれを行うことができます:
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped);
詳細情報を参照してください: http://msdn.Microsoft.com/nl-nl/library/system.serviceprocess.servicecontroller.waitforstatus(v = vs.71).aspx
Environment.Exit
は厄介なものです。使用しないでください!これは、finallyブロックでのクリーンアップを実行せずに、GCによるファイナライザーメソッドを呼び出さずに、ハードウェイでアプリケーションを中止します。他のすべてのフォアグラウンドスレッドなどを終了します。 。
私はプロジェクトで次の機能を使用しています
public static ServiceController GetService(string serviceName)
{
ServiceController[] services = ServiceController.GetServices();
return services.FirstOrDefault(_ => Contracts.Extensions.CompareStrings(_.ServiceName, serviceName));
}
public static bool IsServiceRunning(string serviceName)
{
ServiceControllerStatus status;
uint counter = 0;
do
{
ServiceController service = GetService(serviceName);
if (service == null)
{
return false;
}
Thread.Sleep(100);
status = service.Status;
} while (!(status == ServiceControllerStatus.Stopped ||
status == ServiceControllerStatus.Running) &&
(++counter < 30));
return status == ServiceControllerStatus.Running;
}
public static bool IsServiceInstalled(string serviceName)
{
return GetService(serviceName) != null;
}
public static void StartService(string serviceName)
{
ServiceController controller = GetService(serviceName);
if (controller == null)
{
return;
}
controller.Start();
controller.WaitForStatus(ServiceControllerStatus.Running);
}
public static void StopService(string serviceName)
{
ServiceController controller = GetService(serviceName);
if (controller == null)
{
return;
}
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped);
}
コード例では、service.Stop()
およびServiceController.Stop()
コマンドは、ServiceBase.Run(service)
が操作をブロックし、停止時にのみ返されるため、サービスの実行中は呼び出されないため、何もしません。サービス。