2010-05-05 5 views
2

매일 오전 2시에 이벤트를 트리거하는 System.Timer 설정이 있습니다. 타이머가 시작되는 프로세스가 실패하면 프로세스가 성공적으로 완료 될 때까지 타이머 을 15 분마다 다시 실행 시키려고합니다.Interval 속성이 변경된 경우의 System.Timer 동작

// this is how the timer is set up. 
// this is working correctly. 

double startTime = milliseconds_of_hour_to_start. 

Timer = new System.Timers.Timer(startTime); 

다음은 이벤트 처리기의 성공 또는 실패시 타이머를 재설정하는 코드입니다. 참고 타이머가 중지되지 않고 Interval 속성 만 다시 설정됩니다.

if (ProcessSuccess) 
{ 
    Timer.Interval = TimeSpan.FromHours(24).TotalMilliseconds; 
} 
else 
{ 
    Timer.Interval = TimeSpan.FromMinutes(15).TotalMilliseconds; 
} 

제 질문은 프로세스가 실패한 경우 4 번 말한 다음 타이머가 이제 약 3AM에서 실행됩니까? 즉, 실패한 후 2AM의 원래 시작 시간은 15 분으로 향상됩니까?

+0

향후 구현을 위해 http://quartznet.sourceforge.net/을 살펴볼 가치가 있습니다. 필자는 항상 기존 라이브러리를보고 스스로 재사용 할 수 있기를 선호합니다. –

답변

2

download Reflector으로 보내 주시면 다음과 같은 질문에 신속하게 답변 해드립니다. 타이머의 간격은 TimerBase.ChangeTimer()에 의해 변경됩니다. 간격 업데이트가 안전하고 정확한지 확인하는 데는 몇 가지 조치가 필요합니다. 코드는 finally 블록에서 실행되므로 ThreadAbortException조차도이를 망칠 수 없습니다. 액세스권이 thread간에 직렬화되도록 (듯이), 락 (m_lock 멤버)를 취득합니다. ChangeTimerNative() 호출은 CLR로 호출하여 기본 타이머를 업데이트합니다. 이 메서드는 TimerNative :: CorChangeTimer()에 의해 구현되며 ChangeTimerQueueTimer() Windows API 함수를 호출합니다. 이 함수는 Elapsed 콜백 함수 내부에서 호출 된 경우에도 안전하다고 문서화됩니다.

짧게 짧게, 예 : 찾고있는 동작이 있습니다. 그러나 필연적 인 경쟁 조건을주의하십시오. 타이머가 이미 경과되었을 수 있으며 콜백을 만드는 스레드 풀 스레드가 이미 실행되도록 예약되었지만 아직 실행할 기회를 얻지 못했을 수 있습니다. 타이머를 변경 한 후 바로 콜백을받는 것은 불가능하지 않습니다.

관련 문제