C 執行緒呼叫主線程中的控制項

2022-05-03 18:39:09 字數 2284 閱讀 5958

由於專案的需要,最近幾天一直在做串列埠和資料庫。由於

c#使用的時間不長,所以在編寫**和除錯的過程中總是遇到意想不到的問題,比如在使用串列埠接收資料的時候,在接收資料事件中想把接收的資料放入乙個

textbox

作顯示,但是明明非常簡單的**,在編譯的時候總是提示有錯誤。後來檢視網上資料,才知道

c#還有委託,匿名等等之類的新東西。下面我就把我這幾天的經驗和大家分享一下。這次就主要說說委託和匿名方法,以後在說說串列埠使用方面的經驗。

先說一下委託的基本概念,委託是一種引用型的資料型別,其實它的概念和

c語言的函式指標幾乎是一樣的。回憶一下

c語言的函式指標,定義乙個函式指標,需要指定形參的型別和返回值的型別,只要有函式的形參型別和返回型別和這個函式指標一致,那麼該函式指標就可以指向這個函式。

c語言學習中一定會提高乙個四則運算的例子,就是利用函式指標。

c#中委託的申明如下

【訪問修飾符】

delegate

返回值型別

委託名(【引數列表】);

委託雖然是一種資料格式,但是卻需要像類一下去例項化。所以委託的例項化如下

委託型別

委託變數名

= new

委託型建構函式(委託要引用的方法名)

例項化過後就可以使用命名方法和匿名方法兩種方法,來來指定這個委託的函式引用。

廢話少說,還是來乙個例項吧。比如說,在主線程之外開闢乙個執行緒,這個執行緒使用主線程的乙個

label

控制項,顯示當前的時間。由於新開的執行緒要使用其他執行緒開的控制項,所以需要使用到

control

型別的invoke

方法,而這個方法傳入正是

delegate

型別。先來看乙個「想當然」的**。

private

void

showdatetimemethod()

}private

void

form1_load(object

sender, eventargs

e)用我的大腿想想,上面的**應該是對的,但是由於

net苛刻的安全機制,

showdatetimemethod

中的**是有錯誤的。為了解決這個錯誤可以宣告乙個委託型別,例項化乙個委託變數(這話聽起來很拗口),並給這個委託變數指定函式引用。

方法一,使用命名方法

//宣告乙個委託型別,該委託型別無輸入引數和輸出引數

public

delegate

void

processdelegate();

//函式引用,

label

控制項顯示當前時間,輸入引數無,輸出引數無,和宣告的委託型別形式一致

public

void

labelshow()

while

(true)

這樣的話就可以在窗體中看到當前的時間了。

方法二,使用匿名方法

剛剛的函式引用只有區區一行,這一行完全可以使用匿名方法實現,如果使用匿名方法的話就可以免去編寫乙個函式,**顯得非常簡潔。

匿名方法使用方法也很簡單。

委託型別

委託變數

= delegate

(【引數列表】)

;while

(true)

;label1

.invoke(showprocess);

//執行緒暫停

thread

.sleep(1000);

}方法三,使用methodinvoker

再觀察一下上面的**,這個委託型別,輸入引數無輸出引數也無,就可以使用c#的

methodinvoker

直接構造,關於

methodinvoker

,msdn

給出這樣乙個解釋「

表示乙個委託,該委託可執行託管**中宣告為

void

且不接受任何引數的任何方法」

//使用匿名方法

2while

(true)));

//執行緒暫停

thread

.sleep(1000);

}如果熟悉了

c#的委託和匿名方法之後,那麼在使用串列埠控制項的時候就方便了很多。但是解決了舊的問題,新的問題也會到來。如果串列埠獲得的資料很多,直接在接收的時候處理的話很難保證實時性,**也變得很臃腫不堪。通過查閱網上的資料,想嘗試使用非同步的方法處理問題,即串列埠接收事件只負責接收資料,並把資料放入佇列中乙個執行緒每隔一段時間處理執行緒的內容,然後把整理好的資料放入資料庫中。不過這要下次再說了啊。

出自:

C 執行緒呼叫主線程中的控制項

由於專案的需要,最近幾天一直在做串列埠和資料庫。由於c 使用的時間不長,所以在編寫 和除錯的過程中總是遇到意想不到的問題,比如在使用串列埠接收資料的時候,在接收資料事件中想把接收的資料放入乙個textbox作顯示,但是明明非常簡單的 在編譯的時候總是提示有錯誤。後來檢視網上資料,才知道c 還有委託,...

C 子執行緒操作主線程中的控制項

參考 有兩種方法可以選擇 1 在程式初始化的時候對要操作的控制項設定下面的屬性 system.windows.forms.control.checkforillegalcrossthreadcalls false 這樣,系統就不會再丟擲上面所說的這個錯誤了。從實質上說,該方法是通過採用取消執行緒安全...

C 跨執行緒操作控制項 子執行緒修改主線程式控制件

3.子執行緒修改主線程式控制件 1 錯誤的直接使用 1 voidchangetext 2 效果圖 2 關閉跨執行緒的檢查 1 checkforillegalcrossthreadcalls false 效果圖 注 引數型別是object型 1 public delegate void changet...