2012-01-30 3 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 
     } 
    } 

내가 서비스가 다른 서비스를 확인하고 시작하려는 ... 그것을 시작 중지 모든

+0

사용중인 코드에 어떤 문제가 있습니까? 어디가 잘못 됐어? –

+0

그리고 적절한 enum 값과 직접 비교하는 대신 enum을 int로 변환하는 이유는 무엇입니까? 그러면 더 쉽게 읽을 수 있습니다. –

답변

5

첫째, 이유 ServiceController의 Status 속성을 편리한 ServiceControllerStatus enum에서 int로 변환하고 있습니까? 열거 형으로 남겨 두는 것이 가장 좋습니다. 특히 0으로 비교하는 하트 비트 코드는 ServiceControllerStatus가 가능한 값으로 0을 가지지 않기 때문에 실행되지 않습니다.

둘째, 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 서비스를 설치할 때 서비스에 대한 종속성을 설정하려고합니다. 그런 다음 사용자가 서비스 관리자에서 서비스를 시작하면 자동으로 종속 서비스를 시작합니다.