C 跨執行緒操作控制項的執行緒安全性方法

2021-06-01 18:23:23 字數 1261 閱讀 9793

一、             引言

在c#中,經常用到這樣乙個場景,windows form程式啟動乙個工作者執行緒執行一部分工作,這樣做是為了避免速度慢的工作如果直接呼叫會使得主form停止響應一段時間。既然啟動了執行緒,就避免不了執行緒之間資料傳遞的事情,相信你有很多種辦法能解決,總之注意同步和互斥操作就好。我想說的是,工作執行緒處理中可能想操作某個主線程的windows form的control,比如按鈕,listview等等更新工作狀態之類,直接控制是不行的,不能夠跨執行緒操作另乙個執行緒建立的windows form控制項。

二、相關知識介紹

windows 窗體中的控制項被繫結到特定的執行緒,不具備執行緒安全性。因此,如果從另乙個執行緒呼叫控制項的方法,那麼必須使用控制項的 invoke 方法來將呼叫封送到適當的執行緒。         

屬性control.invokerequired   獲取乙個值,該值指示呼叫方在呼叫控制項的方法時是否必須通過控制項的invoke方法來實現。該屬性可用於確定是否必須呼叫 invoke 方法,當不知道什麼執行緒擁有控制項時這很有用。

當從另乙個執行緒呼叫控制項的方法或屬性時,只有屬性invokerequired和方法

invoke

、begininvoke

、endinvoke

creategraphics

可以直接呼叫,控制項的其他屬性和方法的呼叫必須通過呼叫控制項的invoke方法來實現。

控制項invoke方法的兩種過載形式

(1)public object invoke (delegate method)

在擁有此控制項的基礎視窗控制代碼的執行緒上執行指定的委託

返回值為正在被呼叫的委託的返回值,或者如果委託沒有返回值,則為 空引用

(2)public object invoke (delegate method, params object args)

在擁有控制項的基礎視窗控制代碼的執行緒上,用指定的引數列表執行指定委託。

method 乙個方法委託,它採用的引數的數量和型別與 args 引數中所包含的相同。

args 作為指定方法的引數傳遞的物件陣列。如果此方法沒有引數,該引數可以是 空引用

返回值為正被呼叫的委託返回值;如果該委託沒有返回值,則為 空引用

三、總結

(2)       如果不能,就必須使用控制項c的invoke方法來將對控制項c的一些操作封送到適當的執行緒。

C 跨執行緒操作控制項的執行緒安全方法

c 跨執行緒操作控制項的執行緒安全方法 在c 中,經常用到這樣乙個場景,windows form程式啟動乙個工作者執行緒執行一部分工作,這樣做是為了避免速度慢的工作如果直接呼叫會使得主form停止響應一段時間。既然啟動了執行緒,就避免不了執行緒之間資料傳遞的事情,相信你有很多種辦法能解決,總之注意同...

C 跨執行緒操作控制項的執行緒安全方法

c 跨執行緒操作控制項的執行緒安全方法 在c 中,經常用到這樣乙個場景,windows form程式啟動乙個工作者執行緒執行一部分工作,這樣做是為了避免速度慢的工作如果直接呼叫會使得主form停止響應一段時間。既然啟動了執行緒,就避免不了執行緒之間資料傳遞的事情,相信你有很多種辦法能解決,總之注意同...

C 跨執行緒操作控制項的執行緒安全方法

c 跨執行緒操作控制項的執行緒安全方法 在c 中,經常用到這樣乙個場景,windows form程式啟動乙個工作者執行緒執行一部分工作,這樣做是為了避免速度慢的工作如果直接呼叫會使得主form停止響應一段時間。既然啟動了執行緒,就避免不了執行緒之間資料傳遞的事情,相信你有很多種辦法能解決,總之注意同...