2011-12-20 89 views
1

我已經實現與數據綁定一個DispatcherTimer這將像一個秒錶或計數計時器來顯示一個音頻呼叫期間所經過的時間緩慢,每分鐘。 (你可以在你的手機看)DispatcherTimer成爲更新UI

下面的代碼變得緩慢通過「1秒」這是不是在計算賬單好每一分鐘。你能告訴我我錯在哪裏嗎?

System.Windows.Threading.DispatcherTimer dispatcherTimer; 
int seconds = 0; 
public string Counter { get; set; } 
public Timer() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
     dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); 
     dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
     dispatcherTimer.Interval = new TimeSpan(0, 0, 1);   
    } 
    private void dispatcherTimer_Tick(object sender, EventArgs e) 
    { 

     Counter = (seconds/3600).ToString() + ":" + (seconds/60).ToString("00") + ":" + (seconds % 60).ToString("00"); 
     NotifyPropertyChanged("Counter"); 
     seconds++; 
    } 

我比較了該計時器與其它止動無論在因特網以及在移動,該定時器是越來越由第二爲每分鐘延遲手錶。

回答

4

你是依靠計時器,它似乎是相同的量始終不準確的。

你爲什麼不採取一個時間點和存儲,

private DateTime startTime; 

public Timer() 
{ 
    InitializeComponent(); 
    startTime = DateTime.Now; 
} 

private void dispatcherTimer_Tick(object sender, EventArgs e) 
{ 
    Counter = (DateTime.Now - startTime).ToString(); 
    ... 
} 

實際上走的是這樣的代碼說明了爲什麼你有一個問題。那裏的ToString方法更準確地顯示了計數器,包括毫秒,事實證明計時器不是每1秒觸發一次,而是更像每1.01秒。

我得到的值就是這樣,

1.008 
1.02 
1.031 
1.03901 

然後,您可以替換上面的這個問題,

private void dispatcherTimer_Tick(object sender, EventArgs e) 
    { 
     TimeSpan elapsedTime = (DateTime.Now - startTime); 
     Counter = string.Format("{0:hh\\:mm\\:ss}", elapsedTime); 

,這將是格式化像你之前有它沒有毫秒。

+0

感謝您的評論,我也測試了System.Timers.Timer和它的同樣的問題。你能推薦我嗎? – Coder323 2011-12-20 01:43:31

+0

另一個我提到的是System.Threading.Timer – peter 2011-12-20 01:44:45

+0

作爲Darren Kopp說,我認爲我的問題是在計算秒數比計時器,你可以請投入一些光? – Coder323 2011-12-20 01:46:16

1

你不能保證有事件發生火災究竟1000ms的時間間隔。您應該計算在事件秒,而不是增加自己的領域持有秒

+0

感謝您的評論,而不是增加我的領域,你能告訴我任何其他方式在事件計數? – Coder323 2011-12-20 01:44:24