WPF下的DispatcherTimer穩定性
一、問題的提出
在WPF桌面程式中,要用到定時器,微軟給我們提供了多種選擇,其中兩種是System.Windows.Threading.DispatcherTimer(下面簡稱DispatcherTimer)和System.Threading.Timer(下面簡稱Timer),其他的就不在這裡敘述了。
二者區別在於,DispatcherTimer是執行在UI執行緒上的,最大的好處是可以在定時事件中修改UI元素,Timer是執行在獨立的執行緒上的,與UI執行緒無關,如果需要修改UI控制元件,則必須委託給排程器this.Dispatcher進行。
剛剛建立WPF工程時,使用了DispatcherTimer,定時週期為1秒,在介面上顯示格式為HH:mm:ss的時間,效果良好,間隔均勻穩定。
後來,在WPF工程中,添加了很多模組,如UI介面元素、通訊模組等,特別是很多硬體控制模組,每個硬體模組都可能有一個單獨的執行緒。
突然,前天發現,UI介面上的時鐘HH:mm:ss顯示不均勻、不穩定了,有時候3秒鐘才更新時鐘顯示。苦思良久,未得要領。
二、原因查詢
2.1 效能懷疑
我懷疑是當前電腦效能太弱,難以支撐越來越龐大的軟體。當前電腦的配置為CPU J1900,記憶體DDR3 4G,固態硬碟128G。於是,把程式移植到另一臺強大很多的電腦,配置為CPU i7 四代,記憶體8G DDR3,固態硬碟120G,加1T機械硬碟。兩臺電腦的作業系統是一樣的。
結果,問題依然存在。
2.2 懷疑過多的硬體模組
花了半天功夫,註釋掉所有的硬體模組程式碼,好不容易讓程式能跑起來。
結果,問題依然存在。
2.3 懷疑過多的軟體功能模組。
花了半天功夫,註釋掉所有的軟體模組程式碼,好不容易讓程式能跑起來。
結果,問題依然存在。
2.4 懷疑是定時器的問題
把DispatcherTimer改為Timer,情況大為改觀。此時猜測是DispatcherTimer的效能不如Timer引起的。
但這個猜測不能解釋另一現象——“對於新建的WPF工程,只新增HH:mm:ss顯示功能,DispatcherTimer效果很好”。
2.5 懷疑是UI介面過於複雜
把Timer改回DispatcherTimer,把UI介面的圖片等複雜元素全部隱藏,只留下HH:mm:ss顯示功能,情況大為改觀。此時,嘗試著把所有軟體功能模組開啟,HH:mm:ss顯示很好。然後,嘗試著把硬體模組全部開啟,HH:mm:ss顯示很好。
三、結論
DispatcherTimer執行在UI執行緒上,可以方便地修改UI元素,但是當介面顯示比較複雜的時候,UI執行緒的實時重新整理任務比較重,此時不應該用DispatcherTimer做嚴格週期性任務,而應改用Timer或其他的定時器。
--------------------- 作者:究竟實相 來源:CSDN 原文:https://blog.csdn.net/jiujingshixiang/article/details/53557846?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!