2012-03-16 4 views
3

간단한 Windows 서비스 응용 프로그램을 만들 수있었습니다. 그냥 프레임. 그러나 나는 아직도 혼란 스럽다. 실제로 Windows 서비스에 대한 코드를 어디에 두어야합니까? 나는 여기에 포함/호출/통합하고자하는 별도의 프로그램을 가지고 있습니다. 어디서 프로그램을 작성해야합니까? 어디에서 시작해야합니까?C# windows 서비스 프로그램

public partial class MyNewService : ServiceBase 
{ 
    public MyNewService() 
    { 
     InitializeComponent(); 
     if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
     { 
      System.Diagnostics.EventLog.CreateEventSource(
       "MySource", "MyNewLog"); 
     } 
     eventLog1.Source = "MySource"; 
     eventLog1.Log = "MyNewLog"; 
    } 




    static void Main() 
    { 
     System.ServiceProcess.ServiceBase[] ServicesToRun; 
     // Change the following line to match. 
     ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
    } 
} 

}

답변

3

당신은 OnStart 방법 (및 기타 유사한 것 같은 OnStop, OnShutdown 등)를 오버라이드 (override) 할 필요가있다.

이렇게하면 OnStart 메서드가 실행되지 않거나 실행 시간이 오래 걸리지 않았는지 확인하십시오. 이것은 종종 실제 서비스 로직을 자체 스레드에서 실행하는 것을 의미합니다. 필요에 따라

0
MyNewService에 다음과 같은 메소드를 오버라이드 (override)

:

당신은 On____ 방법을 사용하여 전송되는 다양한 이벤트에 반응
protected virtual void OnContinue(); 
protected virtual void OnCustomCommand(int command); 
protected virtual void OnPause(); 
protected virtual bool OnPowerEvent(PowerBroadcastStatus powerStatus); 
protected virtual void OnSessionChange(SessionChangeDescription changeDescription); 
protected virtual void OnShutdown(); 
protected virtual void OnStart(string[] args); 
0

가 (당신이 그들을 대체 할 수 있도록 그들이 가상입니다). 특히 간단한 경우에

는 :

protected override void OnStart(string[] args) 
{ 
    //Do stuff here 
} 
1

this walkthrough에서, 당신이 OnStart()을 무시했다.

Windows 서비스 프로그램 템플릿을 사용하지 않는 경우 프로그래밍 서비스를 훨씬 쉽게 해주는 check out this library을 원할 수 있습니다. 현재 빌드 한 서비스 실행 파일은 직접 실행될 수 없으며 설치 만 가능합니다. Hoytsoft의 라이브러리는 일반 Windows Form 응용 프로그램과 마찬가지로 설치되어 자동으로 실행됩니다.

0

OnStart() 기능을 무시해야합니다. 생성자를 비워 두는 것이 좋습니다 (서비스뿐만 아니라 다른 이야기이기도합니다). 현재 동일한 함수에서 생성자에있는 모든 코드를 이동하는 것이 좋습니다. 처음에는 원하는 작업을 수행하는 스레드를 하나 이상 회전시킵니다. OnStart()가 가능한 멀리 반환해야한다는 것을 기억하십시오. 작업 스레드를 정상적으로 차단하려면 OnStop() 함수에서도 일부 논리를 구현해야합니다.

0

위에서 말한 것처럼 OnStart()에 코드를 넣지 마십시오. 왜? OnStart() 메서드가 빨리 반환되지 않으면 서비스 관리자가 응답하지 않는 서비스로 플래그를 지정하고 종료하게됩니다.

그래서 코드를 Start() 메서드에 넣고 모든 OnStart()는 Start()를 호출합니다. 마찬가지로 :

protected override void OnStart(string[] args) 
    { 
     Start(); 
    } 

    public static void Start() 
    { 
     ... do stuff 
    } 

또한 서비스를 시작하기위한 코드가 컴파일 또는 디버그 모드에 있는지 여부에 따라 다르게 동작합니다.

System.ServiceProcess.ServiceBase[] ServicesToRun; // Change the following line to match. ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun);

나는이 제대로 작동하고 난 다시 코드를 변경해야 할 필요는 없습니다 앞뒤로 실행하거나 디버깅 할 수 있는지 확인하기 위해 수행.

 if(Debugger.IsAttached) 
      Service.Start(); 
     else 
     { 
      ServiceBase[] ServicesToRun; 
      ServicesToRun = new ServiceBase[] 
      { 
       new Service() 
      }; 

      ServiceBase.Run(ServicesToRun); 
     } 
0

비즈니스 로직을 호출하도록 OnStart() 메서드를 재정의하십시오.앞에서 언급했듯이, 기능을 갖기 위해 다른 스레드를 생성하거나 이벤트 핸들러를 타이머와 함께 사용하여 (스레딩을 다시 사용하여) busineess 로직을 호출 할 수 있습니다. 서비스는 OS에 제어권을 반환해야하므로 서비스가 실행되는 동안 Onstart Method가 창에 컨트롤을 반환해야합니다.

전원 끄기, 일시 정지 이벤트를 제어, 일시 중지, 재개, 중지하려면 이러한 방법을 무시하고 논리를 작성해야합니다.