2010-04-07 8 views
6

Windows 서비스를 구축하고 설치할 수 있습니다.매 시간마다 실행되는 Windows 서비스

매 시간마다이 서비스를 실행할 수 있습니까? 주기적으로 매시간 실행하고 싶습니다.

어딘가에 저장할 수 있도록 실행 시간 범위를 알아야합니다.

어떻게 할 수 있습니까?

편집 :이 서비스는 많은 컴퓨터에 설치되므로 100 대의 서버에서 예약 된 작업을 만들고 싶지 않습니다.

답변

12

, 당신은 Task Scheduler을 사용하여 조사한다.

코드가 서비스가되어야하지만 매시간 "활성화"되도록하려면 가장 쉬운 방법은 서비스를 COM 개체로 만들고 매시간 jscript/vbscript를 호출하는 간단한 작업을 예약하는 것입니다 COM 개체를 만들고 간단한 메서드를 호출합니다.

대신주기를 소모하지 않고 대기 API를 사용하여 시간을 "낭비하는"방법도 있습니다. 당신은 또한 어떤 시나리오에 따라 몇 가지 흥미로운 디자인 결정을 고려해야 할

주입니다

  • 어떻게 당신의 서비스가 충돌하면 시작하려고하거나 사용자에 의해 중지?
  • 한시간 후 다시 시작해야한다면 다시 실행해야합니까? 아니면 정확한 시간별 일정을 기다려야합니까?
  • 활성 상태에서 시간대 또는 낮 시간이 변경된 경우 마지막 "활성화"시간을 어떻게 추적합니까?
  • 서비스가 유휴 상태이거나 노트북 덮개가 닫혀있을 때 컴퓨터가 절전/최대 절전 모드로 전환되는 것을 방지합니까? 그렇지 않다면, 귀하의 일정에 맞춰 서비스를 받으려면 한시간에 컴퓨터를 깨울 필요가 있습니까?

일부 작업 스케줄러가 처리하므로 코드에서 한 시간 기다리는 대신 해당 경로를 사용하는 것이 좋습니다.

+0

API가 CPU주기를 낭비하게합니까? 이걸 좀 더 자세히 설명해 주실 수 있습니까? 잠깐 만요 시스템에 의해 발생 이벤트입니다, 나는 아무것도 폴링 생각하지 않습니다. –

+0

나는 당신이 나를 정확하게 이해했는지 확신하지 못한다. 기다려야하는 API가 CPU주기를 사용하지 않도록 최적화되었다고 말하면서 시간이 경과하기를 기다리고 있습니다. –

3

매 시간마다 실행되는 scheduled task을 만들면 서비스를 실행하거나 "깨우기"위해 메시지를 보낼 수 있습니다. 그런 다음 예약 된 작업 요청의 현재 시간을 전달하거나 프로그램이 깨어날 때 현재 시간을 선택하십시오.

Task Scheduler Managed Wrapper을 프로그래밍 방식으로 설정할 때 도움이 될 수 있습니다. 당신은 다른 자원을 위해 google을 할 수 있습니다.

+0

하지만 코드에서 구현할 수 있기를 원합니다. 이 서비스가 많은 서버에 설치 될 것이라고 상상해보십시오. 각 서버로 이동하여 예약 된 작업을 만들고 싶지 않습니다. – DarthVader

+1

@ user177883 : 프로그래밍 방식으로 서비스를 만들 수있는 것처럼 프로그래밍 방식으로 예약 된 작업을 만들 수 있습니다. –

3

몇 가지 옵션이 있습니다.

  1. 1 시간 동안 잠을 잘 수 있습니다.
  2. 서비스가 아닌 예약 된 작업에 더 적합 할 수 있습니다. 당신은 항상 반대로 작업이 일정한 간격으로 실행하려면
2
Thread.Sleep(1000*60*60); 
+2

한 시간 동안 잠자고있는 동안 서비스를 중지하려고하면 어떻게됩니까? –

2
Thread.Sleep(TimeSpan.FromHours(1)); 

코드를 읽기

2

Thread.Sleep() 솔루션은 서비스가 한 시간 간격으로 실행됩니다 있는지 확인한다이 방법은, 아니 매 시간마다 즉 각 작업 1 시간 + 작업을 실행하는 시간에 시작됩니다. 서비스 내에서 Timer을 사용해보십시오. 작업을 실행할시기를 제어하고 진행 상황을 모니터링 할 수 있기 때문에 더 강력한 솔루션이 될 것입니다. 각 Timer 이벤트가 다른 스레드에서 실행되고 작업이 실행되는 데 1 시간 이상 걸리는 경우를 기억하십시오. 동시 작업을 피하기 위해 첫 번째 작업이 완료되기를 기다리는 것.

0

작업 스케줄러는 좋은 생각 일 수 있지만 서비스는이를 위해 설계되었습니다. 서비스는 쉽게 설치되고 적절하게 기록됩니다. 서비스를 시작할 때 시스템 타이머 (System.Threading.Timer)를 설치하거나 타이머를 한 번 더 추가하면됩니다.

관련 문제