2011-09-15 2 views
0

저는 n 개 (현재 n = 2) 개의 인스턴스로 Azure Worker Role을 가지고 있습니다. 이러한 각 인스턴스에는 20 초마다 실행되는 System.Timers.Timer가 주 스레드에 있으며 일부 작업 프로세스가 생성됩니다. 롤 인스턴스가 처음에 부팅되면 내부 엔드 포인트를 통해 동기화되어 타이머가 동시에 시작됩니다 (이 작동).Azure Worker Role에서 방황하는 System.Timers.Timer

심지어 같은 간격을 가진이 두 개의 타이머는 돌아 다니는 경향이 있습니다. 이전에는 몇 초 전에 끝나고 다른 하나는 같은 방향으로 갈 수 있습니다.

public override void Run() 
{ 
    while (true) 
    {    
     GC.KeepAlive(this.LogTimer); // make sure garbage collection never touches the timer            
    } 
} 

질문 :이 원인이 될 수있는 어떤

  1. 내 실행 방법은 다음과 같은 기본적으로?

  2. while (true) {} 루프에 Thread.Sleep (sleeptimeinMS) 호출을 추가하면 주 스레드가 항상 busy 상태가되는 것을 방지하여 을 향상시킬 수 있습니다 ( ). 타이머 스레드가 어떻게 든 자유롭게 할 수 있습니다. 그것의 의무?)?
  3. 외부 시계를 일부 주기적으로 역할을 다시 동기화해야 할 올바른 대답은 무엇입니까?
  4. 이것을 구현하는 근본적으로 다른 방법은 무엇입니까? 시간에 미리

감사합니다,

알렉스

답변

2

System.Timers.Timer는이 OS의 쓰레드 스케줄링에 의해 제한되고, 100 % 정확합니다. 두 개의 개별 서버가 각각 타이머를 실행하면 결과적으로 동기화가 해제됩니다.

+0

예, System.Timers.Timer의 정확도 제한이 있으며 읽는 동작에 놀라지 않지만 내 응용 프로그램에는 100 % 정확도가 필요하지 않으며 20- 서로 5 초 이내에 두 번째 타이머 (나는 원래 게시물에서 이것을 말 했어야했다). 그러한 기대치를 감안할 때 어떤 전략을 제안 할 수 있습니까? – user483679

+0

매시간마다 시계와 동기화를 시도하십시오. 하나의 진드기는 5 초 내에 편안하게 맞을 정도로 정확해야합니다. – driis

+0

OK ... 아마 맞을 것입니다. 불필요한 경과 이벤트를 피하는 Timer 스레드를 관리하는 코드를 작성하고 버클 링해야합니다. 감사. 나는 이것이 시험 될 때 시험하고 당신에게 신용을 줄 것이다. – user483679

관련 문제