我嘗試在每10-15毫秒更新一次的Windows phone timer(用於UI元素)中創建。我想有機會追加時間。所以我創建了TimeSpan和DispatcherTimer,其中interval = 15 ms。因此,每15毫秒調用一次事件,我將timeSpan減去15 ms,並且當時間範圍< = 0時,我調用某種方法。當我設置時間跨度4秒(例如)在生命中超過4秒約4,6秒。此外,我嘗試使用異步/等待,但這沒有奏效。我嘗試使用System.Threading,但我不知道如何更新在其他線程中創建的元素。從線程更新UI元素
回答
So every 15 ms call the event where i subtract 15 ms to timeSpan and when timespan <= 0 i call some method.
你的邏輯是有缺陷的。你不可能更新時間跨度這種方式,因爲:
- 由於斯蒂芬·克利裏在他的回答中提到,你有沒有保證,計時器會觸發正好15毫秒
- 即使它沒有,這不是」考慮到實際更新時間段所需的時間(例如計算新時間段需要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, ...)
}
哦,我是傻子(: 非常感謝 – RrrangeTop
試試這個在您的計時器線程
Dispatcher.BeginInvoke(() =>
{
//Update Your Element.
});
BeginInvoke工作,但時間超過生命中的時間 – RrrangeTop
更新UI元素,以便每15毫秒調用其中i減去15毫秒的時間跨度
還有是你的問題的事件。
當您在任何Windows平臺上設置計時器時,無法期望達到很高的精度。在桌面上,我認爲消費者硬件上的正常調度程序時間約爲12ms(當然,其他應用程序可以大大減少這種情況)。我不知道電話的時間安排是什麼,但我認爲它不如臺式電腦準確(電池壽命的原因)。
所以,你根本無法以這種方式在Windows上處理這個問題,因爲你不能假定計時器每隔15ms就會觸發一次。相反,只需啓動DispatcherTimer
即可滿足您需要的全部時間範圍,例如4秒。
- 1. Android-使用線程更新UI元素
- 2. 從Windows 8/WinRT中的不同線程更新UI元素
- 3. 從ViewModel更新UI線程
- 4. 從線程更新UI
- 5. 如何從線程更新Kivy元素?
- 6. 爲什麼必須始終從UI線程創建/更新UI元素?
- 7. 更新UI線程
- 8. 更新UI線程
- 9. 通知中心發佈更新主線程上的UI元素?
- 10. 如何更改新線程task.onDone()中的UI元素?
- 11. Android更新UI線程元素 - 最佳實踐?
- 12. UI元素沒有更新
- 13. 訪問/從不同的線程更改UI元素屬性
- 14. 從後臺線程更新UI控件
- 15. 從類(多線程)更新UI?
- 16. Javafx從線程更新UI Java 8
- 17. 從後臺更新UI線程
- 18. 從外部UI線程更新gridview
- 19. 如何從線程更新UI?
- 20. Android:定期從線程更新UI
- 21. 從另一個線程更新UI(progressDialog)
- 22. C#WPF從工作線程更新UI
- 23. 從多個後臺線程更新UI
- 24. 從後臺線程更新UI
- 25. QT Jambi:從其他線程更新UI
- 26. 從另一個線程更新UI
- 27. 從WinRT中的線程更新UI
- 28. 使用audiotrack從線程更新ui
- 29. 從非UI線程更新控件
- 30. 如何從線程更新UI
爲什麼你使用15毫秒的時間間隔,而不是整個時間,你想等待(4秒,如果我理解正確)?在UI線程中調用需要一些時間,所以我想這就是導致延遲/不準確的原因。另外,使用異步/等待應該工作。 – yasen
我每15毫秒更新一次用戶。它看起來不錯。所以,我使用異步等待 '異步任務 calculateTime() {timeRemaining - = TimeSpan.FromMilliseconds(TIC);}' 比 '異步空隙timer_Tick(對象發件人,EventArgs的){風險一個等待= calculateTime(); } ' –
RrrangeTop
其中tic = 15 timeRemaining = 4000 – RrrangeTop