在公司維護一個十年前的WinForm老程式,并且這個程式經過了多人之手修改。
領導讓我修改部分程式,在修改的程序中我發現個問題。這個老程式用了很多的表單Timer,也有部分執行緒。
但程式使用了CheckForIllegalCrossThreadCalls = false陳述句,經查詢發現該陳述句是用于跨執行緒呼叫不需要采用委托方式,可以直接呼叫。
在更新脫機地圖的圖元狀態的時候,使用了一個執行緒來更新,但發現圖元更新的非常慢,沒有幾個圖元,但更新速度就像蝸牛在爬。于是反復的查找更新部分為什么會這么慢,但是沒有發現(基于可以直接呼叫UI的控制元件)。后來沒有辦法,試試的心態用了委托方式更新圖元。結果是很不錯的,至少比原來是快了不少。
說了這么多,其實是想了解一下:
CheckForIllegalCrossThreadCalls = false陳述句存在的情況下,如上的直接操控UI控制元件的執行緒和主執行緒的關系,在使用委托和不使用委托的區別。
我個人理解,獨立創建的執行緒,在使用上面陳述句后,直接呼叫UI控制元件的更改部分,會導致獨立執行緒的處理和主執行緒的處理歸結到了一起,或者說是等待主執行緒有空處理,所以才會有獨立執行緒并不獨立的情況。不知道我的理解對不對??還請了解的大牛說明!!





uj5u.com熱心網友回復:
我看網上的解釋是CheckForIllegalCrossThreadCalls =true;的時候 .net會對程式使用UI控制元件進行安全檢查 ,避免跨執行緒導致的死鎖、狀態不對的bug而CheckForIllegalCrossThreadCalls =false;.net不會對程式使用UI控制元件進行安全檢查,全靠程式員自己避免以上bug,實際上還是多個執行緒對界面控制元件操作
uj5u.com熱心網友回復:
實際上應該是多執行緒,不過呼叫UI控制元件后,感覺是在一個處理執行緒下。
uj5u.com熱心網友回復:
設定了 CheckForIllegalCrossThreadCalls = false 這就相當與生活在垃圾堆之中,程式的資料和業務邏輯隨時會因為執行緒沖突而胡亂走,結果完全不確定,完全失控。這樣設計僅僅對于初學練手的人是“方便”一點兒,或者是根本沒有接觸過多執行緒編程的20年前的人剛剛初學執行緒時才用。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/49613.html
標籤:C#
