2013-01-18 135 views
6

我有一個標籤,應該顯示我的計時器的秒數(或換句話說,我有一個變量,每增加1個計時器間隔)。我的計時器的間隔設置爲1000,因此標籤應該每秒更新一次(並且還應顯示秒數)。但標籤已經在數百秒之後。什麼是1秒鐘的適當間隔?計時器間隔1000!= 1秒?

int _counter = 0; 
Timer timer; 

timer = new Timer(); 
timer.Interval = 1000; 
timer.Tick += new EventHandler(TimerEventProcessor); 
label1.Text = _counter.ToString(); 
timer.Start(); 

private void TimerEventProcessor(object sender, EventArgs e) 
{ 
    label1.Text = _counter.ToString(); 
    _counter += 1; 
} 
+2

你可以發佈你的代碼嗎?什麼意思是「標籤已經上百種了」? – acrilige

+1

你能顯示一些代碼嗎? – Default

+0

我編輯了我的代碼。 –

回答

10

正確的時間間隔得到一個第二個是1000 Interval屬性是以毫秒爲單位刻度之間的時間:

MSDN: Timer.Interval Property

所以,這並不是說你設置,這是錯誤的時間間隔。檢查代碼的其餘部分,例如更改計時器的時間間隔,或多次綁定Tick事件。

4

代替Tick事件,使用Elapsed事件。

timer.Elapsed += new EventHandler(TimerEventProcessor); 

並改變TimerEventProcessor方法的簽名;

private void TimerEventProcessor(object sender, ElapsedEventArgs e) 
{ 
    label1.Text = _counter.ToString(); 
    _counter += 1; 
} 
+2

'timer.Elapsed + = TimerEventProcessor;'就足夠了。 – Default

+0

如果他使用的是System.Windows.Forms.Timer,那麼沒有Elapsed事件。 – nos

+2

這是一個不同的Timer類。沒有'滴答'類和'Elapsed'事件。 – Guffa

1

您使用TimerEventProcessor或計數器的任何其他地方?

無論如何,您不能依賴事件每秒準確傳遞一次。時間可能會有所不同,系統無法確保平均時間是否正確。

所以不是_Counter的,你應該使用:

// when starting the timer: 
DateTime _started = DateTime.UtcNow; 

// in TimerEventProcessor: 
seconds = (DateTime.UtcNow-started).TotalSeconds; 
Label.Text = seconds.ToString(); 

注:這並沒有解決TimerEventProcessor的問題被稱爲常,或_Counter遞增到頻繁。它只是掩蓋了它,但它也是正確的做法。

+1

至少使用'UtcNow'而不是'Now',但即使如此,當時鍾改變時也會出現問題。 – CodesInChaos

+0

哎唷! @CodesInChaos感謝提醒我,修復。 – peterchen