2014-06-07 91 views
0

我嘗試在每10-15毫秒更新一次的Windows phone timer(用於UI元素)中創建。我想有機會追加時間。所以我創建了TimeSpan和DispatcherTimer,其中interval = 15 ms。因此,每15毫秒調用一次事件,我將timeSpan減去15 ms,並且當時間範圍< = 0時,我調用某種方法。當我設置時間跨度4秒(例如)在生命中超過4秒約4,6秒。此外,我嘗試使用異步/等待,但這沒有奏效。我嘗試使用System.Threading,但我不知道如何更新在其他線程中創建的元素。從線程更新UI元素

+0

爲什麼你使用15毫秒的時間間隔,而不是整個時間,你想等待(4秒,如果我理解正確)?在UI線程中調用需要一些時間,所以我想這就是導致延遲/不準確的原因。另外,使用異步/等待應該工作。 – yasen

+0

我每15毫秒更新一次用戶。它看起來不錯。所以,我使用異步等待 '異步任務 calculateTime() {timeRemaining - = TimeSpan.FromMilliseconds(TIC);}' 比 '異步空隙timer_Tick(對象發件人,EventArgs的){風險一個等待= calculateTime(); } ' – RrrangeTop

+0

其中tic = 15 timeRemaining = 4000 – RrrangeTop

回答

2
So every 15 ms call the event where i subtract 15 ms to timeSpan and when timespan <= 0 i call some method. 

你的邏輯是有缺陷的。你不可能更新時間跨度這種方式,因爲:

  1. 由於斯蒂芬·克利裏在他的回答中提到,你有沒有保證,計時器會觸發正好15毫秒
  2. 即使它沒有,這不是」考慮到實際更新時間段所需的時間(例如計算新時間段需要1ms,您的計時器將每15ms漂移1ms)

要獲得準確的時間,您需要存儲您啓動它的時間戳(通過使用DateTime.UtcNow檢索它。每當您的計時器打勾時,採用新的時間戳並減去t o你保存的那個。這樣,你就知道到底有多少時間過去了,你的計時器永遠不會漂移。

private DateTime start; // Set this with DateTime.UtcNow when starting the timer 

void timer_Tick(object sender, EventArgs e) 
{ 
    // Compute the new timespan 
    var timespan = DateTime.UtcNow - start; 

    // Do whatever with it (check if it's greater than 4 seconds, display it, ...) 
} 
+0

哦,我是傻子(: 非常感謝 – RrrangeTop

0

試試這個在您的計時器線程

Dispatcher.BeginInvoke(() => 
     { 
      //Update Your Element. 
     }); 
+0

BeginInvoke工作,但時間超過生命中的時間 – RrrangeTop

2

更新UI元素,以便每15毫秒調用其中i減去15毫秒的時間跨度

還有是你的問題的事件。

當您在任何Windows平臺上設置計時器時,無法期望達到很高的精度。在桌面上,我認爲消費者硬件上的正常調度程序時間約爲12ms(當然,其他應用程序可以大大減少這種情況)。我不知道電話的時間安排是什麼,但我認爲它不如臺式電腦準確(電池壽命的原因)。

所以,你根本無法以這種方式在Windows上處理這個問題,因爲你不能假定計時器每隔15ms就會觸發一次。相反,只需啓動DispatcherTimer即可滿足您需要的全部時間範圍,例如4秒。