在使用c#的過程中,難免會用到多執行緒,而用多執行緒之後,執行緒如何與介面互動則是乙個非常頭疼的問題。其實不僅僅是介面,一般情況下,我們往往需要獲得執行緒的一些資訊來確定執行緒的狀態。比較好的方式是用委託實現,看例子:
注:本例利用委託和跨執行緒訪問技術,用介面上的兩個label控制項實時顯示執行緒的執行次數。網上雖然有很多這方面的文章,但是過於簡略,說明很少,剛剛接觸這方面的程式設計師很難理解,故寫此文。
testclass類:
class testclass}}winform介面**:
/// /// 按鈕單擊事件執行效果:///
///
///
private void button1_click(object sender, eventargs e)
/// /// 在介面上更新執行緒執行次數
///
///
private void refreshlabmessage1(long i)
); }
else
}/// /// 在介面上更新執行緒執行次數
///
///
private void refreshlabmessage2(long i)
); }
else
}
說明:
為了便於大家理解,我寫了很詳細的注釋。在這還要說明一下,因為這裡邊有些「莫名其妙」的地方。
l 如何建立執行緒就不廢話了,一看就懂。
l public delegate void testdelegate(long i);這句話是建立了乙個委託,名字是testdelegate,指定了委託的型別,什麼返回值啦、什麼引數啦,可以把testdelegate理解為乙個類,乙個規範;publictestdelegate mainthread;這句話當然就是建立testdelegate類的物件了,真正搭載方法的是mainthread物件,它可以搭載n個方法,順序執行。如何搭載捏?看這句話:testclass.mainthread=
new testclass.testdelegate(refreshlabmessage1);這句話是給testclass物件中的mainthread物件搭載方法,但是後邊的new比較難以理解。大家都知道,new這個關鍵字就是用來建立物件的,剛剛已經提醒大家把委託看成乙個類,因此這new的是testdelegate這個委託,而不是testclass(一定要看清了,如果是new的testclass,要在testclass後加括號的,後邊接的是方法,而testdelegate明顯不是方法,因此會報錯)。相當於是在testclass類中又套了乙個類,所以才會這樣寫。refreshlabmessage1當然就是testdelegate類構造方法的引數,用來指明委託哪個方法。最後把例項賦給同型別的mainthread。另外,在此例中mainthread委託了兩個方法,用+=運算子即可,如果想去除某個方法,亦可用-=運算子。
l 最後需要說明的就是跨執行緒訪問控制項問題。窗體上的控制項只允許建立它們的執行緒訪問,也就是主線程,如果非主線程訪問則會發生異常。我們可以借助於控制項的invokerequired屬性來判斷該控制項目前是否被主線程訪問,如果是,返回false。如果不是,再利用invoke方法找到主線程,讓主線程執行訪問控制項的方法,本例中借助於testclass類中的mainthread物件,委託了訪問控制項的方法refreshlabmessage1,再把mainthread物件傳入執行在主線程上的控制項的invoke方法即可。invoke方法可以理解為:在哪個控制項上呼叫了invoke,就用那個控制項所在的執行緒處理委託方法。在本例中用this呼叫invoke方法,也就是窗體所在的執行緒,當然也是控制項所在的執行緒。invoke的兩個引數分別是:委託、委託的方法需要的引數。
C 利用委託跨執行緒更新UI資料
在使用c 的過程中,難免會用到多執行緒,而用多執行緒之後,執行緒如何與介面互動則是乙個非常頭疼的問題。其實不僅僅是介面,一般情況下,我們往往需要獲得執行緒的一些資訊來確定執行緒的狀態。比較好的方式是用委託實現,看例子 注 本例利用委託和跨執行緒訪問技術,用介面上的兩個label控制項實時顯示執行緒的...
C 中跨執行緒更新UI
出處 c winform程式設計中,跨執行緒直接更新ui控制項的做法是不正確的,會時常出現 執行緒間操作無效 從不是建立控制項的執行緒訪問它 的異常。處理跨執行緒更新winform ui控制項常用的方法有4種 1.通過ui執行緒的synchronizationcontext的post send方法更...
WPF跨執行緒更新UI控制項
1.預設情況下,在windows應用程式中,net framework不允許在乙個執行緒中直接操作另乙個執行緒中的控制項。winform中實現跨執行緒操作控制項的兩種方法 1 關閉執行緒安全檢查 control.checkforillegalcrossthreadcalls false 2 使用控制...