2012-12-06 36 views
4

我有一個關於在我的.NET應用程序中使用System.Timers.Timer的問題。單定時器vs三個定時器性能

我有三個不同的事件,一個觸發每秒鐘,另一個觸發器每分鐘,最後一個觸發每半小時。

擁有一個計時器還是三個計時器,性能更好嗎?

使用一個定時器做到這一點的方法是檢查ElapsedEventArgs'SignalTime並將其與先前測量的時間進行比較。當然,如果你已經改變了日期時間,這並不是很有效,但這不是問題。基本上它每隔一秒鐘就過去一次,我檢查是否已經過了一個半小時......

我擔心使用3個計時器會產生太多開銷。我錯了嗎?爲了簡單和清晰,我應該使用3還是1定時器?

代碼:

private void TimerEverySecondElapsed(object sender, ElapsedEventArgs e) 
    { 
     timerEverySecond.Enabled = false; 
     OnTimerElapsed(TimerType.EverySecond); 

     // Raise an event every minute 
     if ((e.SignalTime - previousMinute) >= minuteSpan) 
     { 
      OnTimerElapsed(TimerType.EveryMinute); 
      previousMinute = e.SignalTime; 
     } 

     // Raise an event every half hour 
     if ((e.SignalTime - previousHalfhour) >= semiHourSpan) 
     { 
      OnTimerElapsed(TimerType.EverySemiHour); 
      previousHalfhour = e.SignalTime; 
     } 

     timerEverySecond.Enabled = true; 
    } 

minuteSpansemiHourSpan是隻讀的時間跨度。

+0

這不回答這個問題,但另一種選擇是有兩個定時器(一個用於秒,一個用於分鐘/30分鐘)。 – Rotem

+0

'只有你可以回答這個問題,有一個計時器還是三個計時器會更好嗎?這是你應用程序的瓶頸嗎? –

+0

**如果您僅使用一個計時器(兩個_if_不會使您的代碼變慢,您是否**配置文件**),那麼性能不會受到任何可測量的影響**,您將節省開銷在資源上)三個計時器。但是你必須考慮的是**如何執行**那個操作(如果你使用一個單一的定時器,你可能需要在池中運行它們,因爲同步**順序執行**可能會延遲最後一個)。 –

回答

0

3個定時器相比增加極少的開銷爲1,代碼將最有可能是好多了(在可讀性和可維護性方面)

0

我覺得跟,如果的是更多的開銷比三個定時器檢查,除此之外,你可能會遇到一些奇怪的情況,試圖使用一個計時器。

我會去三個計時器。

4

這兩種方法都沒有太大區別。不管定時器的數量是多少,只有一個循環在後臺進行。在效率最低的情況下,您將使用線程池中的3個線程,但有很多可用,所以它沒有什麼大不了的。如果它讓你的代碼更容易閱讀,我會說它去。

但請記住,這僅適用於Threading.Timer(又名Timers.Timer)。​​的行爲有點不同,它可能會更好地堅持其中之一,因爲它只在UI線程上運行,所以你可能會遇到一些同步問題。

Threading.Timer vs. Forms.Timer

一些更多資源:

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/f9a1c67d-8579-4baa-9952-20b3c0daf38a/

How many System.Timers.Timer instances can I create? How far can I scale?

+0

好吧,我決定採用更易維護的3個定時器版本。 – Davio