2012-06-13 160 views
3

我試圖讓計時器每分鐘與系統時鐘同步(00:01:00,00:02:00,00: 03:00等)。下面的代碼會產生一個穩定的計時器嗎?我試過運行它。計時器每分鐘精確運行一次。但問題是,幾個月後它會開始流連忘返嗎?C#,System.Timers.Timer,與系統時鐘同步運行每分鐘

private System.Timers.Timer timer; 

public frmMain() 
{ 
      timer = new System.Timers.Timer(); 
      timer.AutoReset = false; 
      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
      timer.Interval = GetInterval(); 
      timer.Start(); 
} 

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
      //Do processing 

      timer.Interval = GetInterval(); 
      timer.Start(); 

} 
private double GetInterval() 
{ 
      DateTime now = DateTime.Now; 
      return ((60 - now.Second) * 1000 - now.Millisecond); 
} 
+0

可能重複運行每次15min與系統時鐘同步](http://stackoverflow.com/questions/10896536/c-system-定時器計時器運行 - 每15分鐘同步 - 系統時鐘)由同一用戶。 –

回答

4

它不會。

DateTime.Now使用系統時鐘作爲參考計時器,所以你的計時器會總是保持與它同步,模系統時鐘分辨率的幾毫秒。

0

我不明白它是如何漂移的,每當計時器滴答時,它就會確定它到下一個確切分鐘的時間,並相應地設置間隔。理論上它實際上很巧妙,因爲我自己定時器會走路。唯一可以肯定的方法是測試它,所以只要你的UI不會凍結超過60秒(可能是50秒就可以安全),那麼就不會有問題。請記住,筆記本電腦經常會在一段時間後睡覺,或者蓋子關閉,這會導致故障。

根據你正在嘗試做什麼,爲什麼不只是使用系統時間,每發生一分鐘的變化就發送一個事件?

0

您的代碼不會漂​​移,但會有(不可避免的)抖動,因爲定時器回調在請求的時間間隔內幾乎沒有反應。

唯一潛在的問題,我可以用這個代碼,看到的是,如果ThreadPool是你的計時器回調不離隊,並一分鐘間隔內執行,從而跳過分鐘這樣的壓力之下。

這似乎有點不太可能,但並不完全超出可能性的範圍。

0

大圖看起來不錯,GetInterval將始終返回一個正值,依此類推。我只看到幾個注意事項:

  1. 如果待機/恢復情況,那麼你可能有一個運行在非回合時間
  2. 如果timer_Elapsed時間超過一分鐘才能完成,那麼你將錯過任何一個節拍
  3. 如果系統超載,結果timer_Elapsed預計40/50秒延遲和timer_Elapsed時間超過60 - delay秒,你會錯過任何一個節拍
[C#,System.Timers.Timer的
+0

笏是解決方案? – Talha

+0

這取決於您決不會錯過一分鐘,您期望您的預定作業運行多少時間(最糟糕的時間),以及您正在嘗試完成什麼 – miniBill

+1

,正如Bill所說,解決方案取決於問題。如果你需要一天運行1440次(即每分鐘一次),那麼也許你應該跟蹤運行次數和運行次數。如果它是一個需要每分鐘運行一次的計時器,那麼everybeat檢查它是否在最後一分鐘運行,如果沒有運行兩次這樣的等... –