1. 程式人生 > >WPF下的DispatcherTimer穩定性

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 版權宣告:本文為博主原創文章,轉載請附上博文連結!