2012-08-17 5 views
4

나는 윈도우 서비스에 들어가고 자습서를보고 있지만, 모두 매우 어리 석다. 일반적으로 재정의 된 OnStart 메서드에서 무언가를 인쇄하는 작업이 포함됩니다. 그것은 한번 불리는 것처럼 들립니다. 이제 어디서 연속적으로 실행해야하는 코드를 어디에 넣을 것입니까?Windows 서비스를 작성할 때 어디에 코드를 넣어야합니까?

+1

대부분의 서비스는 설문 조사에서 작동합니다. 자다; 뭔가를하십시오 - 타이머를 설정하기 위해 OnStart를 사용하는 것은 좋은 방법입니다. 각 타이머 틱에서 타이머가 참조하는 코드가 호출됩니다. – andrew

답변

3

두 개 이상의 클래스가있는 다른 프로젝트와 마찬가지로 - 별도의 프로젝트에 넣습니다.

'Windows 서비스'프로젝트는 서비스를 시작하기위한 상용구, 서비스에 포함 된 타이머 및 그 종류의 것을 포함해야합니다. 나머지 프로젝트를 다른 프로젝트에 넣으면 나중에 데스크톱 응용 프로그램, 웹 응용 프로그램, WCF 서비스 등으로 비즈니스 논리를 사용할 수 있습니다.

2

적절한 Windows 서비스를 만들려면 TopShelf 라이브러리를 사용해야합니다. 그것은 IoC에 친숙하며 Windows 서비스 인프라 코드를 서비스 로직과 완전히 분리하여 유지할 수 있습니다. 또한 서비스를 콘솔 응용 프로그램으로 실행하고 프로덕션 환경의 Windows 서비스로 변환 할 수 있습니다. Windows 서비스를 만드는 것은 "THE"방법이라고 생각하며 결코 뒤돌아 보지 않습니다.

4

서비스 클래스의 모든 On ... 메서드는 가능한 한 빨리 반환해야합니다. Windows 서비스 컨트롤러가 서비스와 상호 작용할 때마다 호출되고 서비스 컨트롤러는 성공적인 반환을 기다립니다. 서비스 제어판 애플릿을 사용하고 서비스를 시작하거나 중지 할 때마다 표시되는 진행률 표시 줄은 해당 서비스의 OnStart 또는 OnStop이 반환 될 때까지 기다리는 동안 표시되는 것입니다.

    가 일정한 작업을 수행하는 별도의 스레드를 시작
  • 서비스가
  • System.Threading.Timer의 (타이머를 설정 수행합니다

    그래서 ONSTART에서 할 수있는 일반적인 것은 하나 다음의 더 다양한 서비스) 주기적으로 수행하는 작업 (일부 국가의 경우 폴링)

  • TcpListener 또는 UdpClient를 사용하여 네트워크 포트에서 비동기 적으로 수신 대기 시작
  • 일부 시스템에 가입 이벤트

이러한 경우 서비스의 작업이 비동기 적으로 수행되고 즉시 OnStart를 종료합니다. 그러나 스레드, 타이머, TcpListener 등을 추적하여 OnStop (및 선택적으로 OnPause 및 OnContinue)에서 상호 작용할 수 있도록하십시오. 대개 타이머를 처리하여 (더 이상 발사하지 않음) 모든 소켓이나 리스너를 종료 한 다음 ManualResetEvent를 설정합니다. 실행중인 모든 스레드는이 이벤트를 주기적으로 확인하고 신호를 받으면 종료해야합니다. 서비스를 성공적으로 종료하고 데이터 유실의 위험을 감수하려면 합당한 시간 초과 (일반적으로 30 초)로 실행중인 모든 스레드에 참가한 다음 시간 초과가 만료 된 후에도 실행중인 스레드를 중단하십시오.

관련 문제