2012-01-30 20 views
-1

私は、特定のサービスをチェックしてチェックするWindowsサービスを作成しています。それがあればplzは私が行うことができますどのように私を助けて... Windowsサービスを開始

protected override void OnStart(string[] args) 
    { 
     Thread thread = new Thread(new ThreadStart(ServiceThreadFunction)); 
     thread.Start(); 
    } 

public void ServiceThreadFunction() 
    { 

     try 
     { 
      ServiceController dc = new ServiceController("WebClient"); 

      //ServiceController[] services = ServiceController.GetServices(); 

      while (true) 
      { 

       if ((int)dc.Status == 1) 
       {     


        dc.Start(); 
        WriteLog(dc.Status.ToString); 
        if ((int)dc.Status == 0) 
        { 

         //heartbeat 
        } 


       } 
       else 
       { 
        //service started 
       } 
       //Thread.Sleep(1000); 
      } 
     } 
     catch (Exception ex) 
     { 
     // log errors 
     } 
    } 

iは、サービスが別のサービスをチェックし、起動したい...それはそれを開始します停止し、すべての

+0

使用しているコードで何が問題になっていますか?どこが間違っていますか? –

+0

そして、適切なenum値と直接比較するのではなく、なぜenumをintにキャストしていますか?それはこれをより読みやすくするでしょう。 –

答えて

5

まず、なぜそのあなたは便利なServiceControllerStatus enumからintにServiceControllerのStatusプロパティをキャストしていますか?エニュムとして残すのがベストです。特に、0と比較するハートビートコードは、ServiceControllerStatusに可能な値として0がないため実行されません。

第2に、while(true)ループを使用しないでください。あなたがそこでコメントしたThread.Sleepでさえ、それはリソースの不必要な消耗です。あなただけ起動するサービスを待つWaitForStatusメソッドを使用することができます。

ServiceController sc = new ServiceController("WebClient"); 
if (sc.Status == ServiceControllerStatus.Stopped) 
{ 
    sc.Start(); 
    sc.WaitForStatus (ServiceControllerStatus.Running, TimeSpan.FromSeconds(30)); 
} 

これが実行状態に到達するためにサービスのために30秒(または何でも)まで待ちます。

更新::元の質問を再読しました。ここでやろうとしていることは、コードで行うべきではないと思います。私が正しく理解していれば、WebClientサービスをインストールする際に、そのサービスの依存関係を設定する必要があります。その後、ユーザーがService Managerでサービスを開始すると、自動的に依存サービスを開始しようとします。