2011-09-15 121 views
0

我有一個Azure工作者角色,n(當前n = 2)個實例。每個這樣的實例在其主線程上都有一個每隔20秒執行一次的System.Timers.Timer,產生一些工作進程。當角色實例初始啓動時,它們通過內部端點同步自己,以便定時器在同一時間啓動(這有效)。在Azure Worker角色中漫遊的System.Timers.Timer

即使在一天的時間裏,這兩個間隔相同的定時器往往會徘徊 - 最終會在幾秒鐘前開始,而另一個可能會走向相同的方向,或者更糟的是,另一個可能會走向相同的方向。

我的run方法基本上是以下幾點:

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)調用通過防止主線程始終忙碌(至 允許定時器線程以某種方式更容易執行)來改進 它的職責?)?
  3. 是否應該嘗試將週期性角色重新同步到某個外部時鐘的正確答案?
  4. 任何完全不同的方法來實現這個?

預先感謝您的時間,

亞歷

回答

2

一個System.Timers.Timer是不是100%準確,它是通過在操作系統線程調度的限制。兩個分別運行Timer的服務器最終會失去同步,這是很有意義的。

+0

是的,我讀過System.Timers.Timer的準確性限制,我沒有(我)看到的行爲感到驚訝,但我的應用程序不需要100%的準確性,只是保持20-第二次在5秒鐘之內彼此(我應該在我原來的帖子中說過)。鑑於這些期望,你能提出任何策略嗎? – user483679

+0

每次打勾後嘗試與時鐘同步。一個嘀嗒聲應該足夠準確,以便在5秒內舒適地擊中。 – driis

+0

好吧......你可能是對的,我只需要壓低並編寫一些管理定時器線程的代碼,以避免不必要的延時事件。謝謝。如果(何時)有效,我會測試並給你信用。 – user483679

相關問題