2017-05-16 1 views
0

좋은 아침마다 몸.C#에서 windows 서비스 결과를 얻으십시오

저는 "Apache"Windows 서비스를 관리하기 위해 C# WinForms의 간단한 애플리케이션을 개발했습니다. 시작하고 중지하고 다른 작업을 시작할 수 있습니다.

내 시나리오 :

  • 난 내가 (내가 그것을 알고) 원인 오류 구성에 만든 아파치 설정 파일을 열고 모든 줄을 변경합니다.
  • 아파치 서비스를 시작하려고하면 설정 파일 구문이 잘못 되었기 때문에 시작이 안됩니다.
  • 서비스의 메시지 오류가 Windows 이벤트 뷰어에 등록되어 있습니다 (알고 있습니다).
  • 내 C# WinForms 응용 프로그램에서이 메시지를 가져 오려면 원하는가요?

내 코드 : 아파치 서비스에서 메시지를 잡기 위해이 코드를 수정하는 방법

public void ManageService(string serviceName, int Operation) 
     { 
      ServiceController sc = new ServiceController(); 
      sc.ServiceName = serviceName; 
      try 
      { 
       switch (Operation) 
       { 
        case 1: sc.Stop(); ; break; 
        case 2: sc.Start(); break; 
       } 
      } 
      catch (InvalidOperationException e) 
      { 

      } 
     } 

.

PD. 미안 영어가 나쁘다면.).

+0

캐치에서 예외를 캡처하고 발신자에게 메시지를 보내 봤습니까? –

+0

@ Karen Payne, 캐치에서 e.Message로 시도했지만 이건 결코 호출하지 않습니다. – Jorny

답변

0

좋아요, 대답은 아니지만 의견에 넣는 방법을 모르겠습니다. WaitForStatus의 사용과 오류 메시지에 대한 특성을 유의하십시오. 이것은 꽤 뼈입니다.

using System; 
using System.Linq; 
using System.ServiceProcess; 

namespace Revenue.Common.Utility 
{ 
    public class WindowsServices 
    { 
     private string _ErrorMessage; 
     public string ErrorMessage { get { return _ErrorMessage; } } 
     /// <summary> 
     /// Stop a Windows service service name 
     /// </summary> 
     /// <param name="ServiceName"></param> 
     /// <remarks> 
     /// A service does not stop instantly, so WaitForStatus method 
     /// is used to 'wait' until the service has stopped. If the 
     /// caller becomes unresponsive then there may be issues with 
     /// the service stopping outside of code. 
     /// </remarks> 
     public void StopService(string ServiceName) 
     { 
      ServiceController sc = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == ServiceName); 
      if (sc == null) 
       return; 

      if (sc.Status == ServiceControllerStatus.Running) 
      { 
       try 
       { 
        sc.Stop(); 
        sc.WaitForStatus(ServiceControllerStatus.Stopped); 
       } 
       catch (InvalidOperationException e) 
       { 
        _ErrorMessage = e.Message; 
       } 
      } 
     } 
     /// <summary> 
     /// Start a Windows service by service name 
     /// </summary> 
     /// <param name="ServiceName"></param> 
     public void StartService(string ServiceName) 
     { 
      ServiceController sc = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == ServiceName); 
      if (sc == null) 
       return; 

      sc.ServiceName = ServiceName; 
      if (sc.Status == ServiceControllerStatus.Stopped) 
      { 
       try 
       { 
        sc.Start(); 
        sc.WaitForStatus(ServiceControllerStatus.Running); 
       } 
       catch (InvalidOperationException) 
       { 
        _ErrorMessage = e.Message; 
       } 
      } 
     } 
    } 
} 
+0

WaitForStatus로 시도했지만 양식이 무한대입니다 – Jorny

+0

여기에 문제없이 사용하고 문제가 없으므로 추가 할 것이 없습니다. –