2016-07-22 63 views
-1

我的WPF應用程序在其「引導」過程中很早就啓動了Threading.Timer。定時器間隔爲100ms,定時器代表中的代碼通常需要大約70ms(它在一系列for循環中執行一些操作,其中一些涉及從串行端口讀取)。啓動計時器後,應用程序的其餘部分被初始化(在DI框架中註冊的類型,視圖的創建,視圖模型,各種其他初始化函數)。在這幾秒鐘內,在定時器代理中執行的代碼完全「失速」。它永遠不會失敗,並且它的連續讀取都不會失敗(不管這純粹是運氣) - 計時器代碼似乎暫停執行大約3秒鐘。爲什麼Threading.Timer委託失速?

我只能假設所有啓動的東西(在UI線程上)獲得更高的優先級,從而阻止計時器線程獲取任何CPU時間。有什麼我可以做的嗎?在啓動過程中稍後啓動計時器可能是一種選擇,但我想首先探索其他解決方案。請注意,Threading.Timer如何處理「重入」(如果這是正確的術語),即在前一次調用仍在運行時計時器「打勾」?當前一個調用最終完成時,下一個調用是否「排隊」並運行?還是我需要自己處理?

回答

1

1)定時器在需要時立即啓動任務,不需要隊列。

Console.WriteLine("Sleep"); 
Thread.Sleep(10000); 
Console.WriteLine("Awaken"); 

你會看到一些像這樣的輸出,1秒的週期:你可以自己與計劃是這樣的檢查

Sleep 
Sleep 
Sleep 
Sleep 
Sleep 
Sleep 
Awaken 
Awaken 
Awaken 
Awaken 
... 

2)你可以改變線程的優先級,但它可能贏你沒有任何好處。所有.net計時器都不適合實時使用。所以不,你無能爲力。

相關問題