2016-09-15 203 views
1

所以我想去做一個定時器,做這樣的:每次我點擊出現這種情況的按鈕:如何在C#中使秒錶顯示秒和毫秒?

0.052

0.521

1.621

2.151

.. 。

但不是,它是這樣的:

0.015

0.032

0.112

0.252

...

這是發生: picture

此代碼是不正確的,我等待了很長時間,直到它使一個秒。

int sec = 0, ms = 1; 
private void button1_Click(object sender, EventArgs e) 
{ 
    timer1.Start(); 
    listBox1.Items.Add(label1.Text); 
    timer1.Interval = 1; 

} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    ms++; 
    if (ms >= 1000) 
    { 
     sec++; 
     ms = 0; 

    } 
    label1.Text = String.Format("{0:0}.{1:000}", sec, ms); 
} 
+1

的GUI線程每秒更新'label1' 1000次?是的,不。使用更大的間隔。留出一些時間讓線程完成繪畫。 –

+0

Windows上的默認計時器分辨率爲15.6毫秒。 –

+0

這只是一個表達錯誤,沒有人對中介價值感興趣。你有一個保證,你的用戶界面每秒更新至少64次,這足以欺騙人的眼睛。只需更新標籤,即可丟失列表框。如果你想讓它精確到原子鐘,那麼使用實際的wallclock時間,因此調用你的Tick事件處理器的操作系統的任何延遲都不起作用。使用Environment.TickCount。 –

回答

4

您應該從.NET Framework的System.Diagnostics命名空間中使用一個秒錶對象。就像這樣:

System.Diagnostics.Stopwatch sw = new Stopwatch(); 

public void button1_Click() 
{ 
    sw.Start; // start the stopwatch 
    // do work 
    ... 

    sw.Stop; // stop the stopwatch 

    // display stopwatch contents 
    label1.Text = string.Format({0}, sw.Elapsed); 
} 

如果你想看到經過的總秒數只有毫秒的總時間(不數分鐘或數小時),您可以更改最後一行到:

label1.Text = string.Format({0}, sw.ElapsedMilliseconds/1000.0) 
+1

或使用內插字符串'label1.Text = $「{sw.ElapsedMilliseconds/1000.0}」;' – flakes

+0

@flkes - 如果用戶使用C#6,那麼效果會很好。 – STLDeveloper