最近在專案中 fix 了乙個和 dispatchertimer 有關的 bug:程式中有乙個 dispatchertimer,每隔一段時間(例如 1s)執行一次,主要就是為了獲得當前的時間,然後根據時間做一些更新。但是在某些時刻,該 dispatchertimer 停止執行了。
在解釋原因之前先解釋以下幾個概念:
第乙個概念是關於 wpf 中的 dispatchertimer。
wpf 中的 dispatchertimer 和 thread 裡 timer 相似但是又有本質的不同。說相似是因為它們的作用相同,都是每間隔一段時間(interval)執行一次對應的方法(tick)。說不同是因為,dispatchertimer 是執行在 ui 執行緒上的,而 timer 是執行於其他執行緒。
dispatchertimer 不能保證在正好在時間間隔 (interval)執行對應的方法(tick),只能保證不會在 interval 之前執行。這是因為 dispatchertimer 方法是放置在 dispatcher 佇列中,是和 ui 相同的執行緒上。(如果想驗證的話,可以在 dispatchertimer 的 tick 方法中列印 thread.currentthread.managedthreadid,並與 ui 執行緒上的 thread.currentthread.managedthreadid 來進行比較)。
第二個就是關於 wpf 中的 exception handler。
在做 wpf 應用程式時,我們經常會在全域性的地方進行 exception handler:
概念講完了,下面說下出現問題的原因了。簡單點說就是在那個時間點上,在 tick 方法中發生了 exception,最終導致當前的 dispatchertimer 停止執行了!
我們可以寫乙個小的 demo 來測試下:
int count = 0;
dispatchertimer timer = new dispatchertimer() ;
timer.tick += (sender, e) =>
trace.writeline(count++);
};timer.start();
執行時,可以發現,當 tick 方法中出現 exception 後,該 dispatchertimer 就被停止了。
solution 1:不要在 tick 方法中出現 exception,但是由於需求的限制,這個暫時是沒有辦法完成的。
solution 2:建立乙個守護的 timer,發現 dispatchertimer 關掉後,重新開啟 dispatchertimer。(沒有嘗試過,但是應該可以。)
solution 3:。。。。。
條條大路通羅馬。出現這個問題的主要原因是由於在 tick 方法中出現了 exception,反過來說,只要在 tick 方法中沒有 exception,那這個 bug 就不存在了。所以我就在 tick 方法中,增加乙個 try...catch...方法,將 exception 吃掉了
int count = 0;
dispatchertimer timer = new dispatchertimer() ;
timer.tick += (sender, e) =>
}catch
trace.writeline(count++);
};
停止執行 電梯因為底坑滲水停止執行,該怎麼處治?
電梯底坑滲水是乙個比較常見的施工質量通病,很多沒有經驗的施工方在地下基礎建造初期沒有足夠重視電梯底坑的防水施工,導致後續不得不因為電梯原因花很大力氣來處理滲水,這是非常得不償失的事情。所以在做基礎施工電梯底坑的時候一定要保證防水質量避免後續整治。根據地區或者企業標準,很多地方是要求電梯底坑不得有明水...
停止mysql服務的執行 啟動和停止MySQL服務
1.啟動mysql服務 啟動mysql服務的命令為 etc init.d mysqld start 命令執行後如圖7 5所示,表示啟動mysql服務成功。也可以用 etc init.d mysqld的簡化命令啟動mysql服務 service mysqld start 命令執行結果如圖7 6所示。2...
matlab停止執行命令 matlab終止執行命令
以c 為例子,matlab停止運作命令視窗按鍵盤快捷鍵有三種 ctrl c ctrl break ctrl alt break。如果是在網路伺服器上跑的編碼得話,按完鍵盤快捷鍵以後有時必須等一小會,程式流程才會停。c 是一種物件導向程式設計的電子計算機程式設計設計語言,由英國atamp t貝爾實驗室...