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

2022-03-01 04:21:32 字數 1382 閱讀 3316

由於專案的需要,最近幾天一直在做串列埠和資料庫。由於c#使用的時間不長,所以在編寫**和除錯的過程中總是遇到意想不到的問題,比如在使用串列埠接收資料的時候,在接收資料事件中想把接收的資料放入乙個textbox作顯示,但是明明非常簡單的**,在編譯的時候總是提示有錯誤。後來檢視網上資料,才知道c#還有委託,匿名等等之類的新東西。下面我就把我這幾天的經驗和大家分享一下。這次就主要說說委託和匿名方法,以後在說說串列埠使用方面的經驗。

先說一下委託的基本概念,委託是一種引用型的資料型別,其實它的概念和c語言的函式指標幾乎是一樣的。回憶一下c語言的函式指標,定義乙個函式指標,需要指定形參的型別和返回值的型別,只要有函式的形參型別和返回型別和這個函式指標一致,那麼該函式指標就可以指向這個函式。c語言學習中一定會提高乙個四則運算的例子,就是利用函式指標。

c#中委託的申明如下

【訪問修飾符】 delegate 返回值型別委託名(【引數列表】);

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

委託型別委託變數名 = new 委託型建構函式(委託要引用的方法名)

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

廢話少說,還是來乙個例項吧。比如說,在主線程之外開闢乙個執行緒,這個執行緒使用主線程的乙個label控制項,顯示當前的時間。由於新開的執行緒要使用其他執行緒開的控制項,所以需要使用到control型別的invoke方法,而這個方法傳入正是delegate型別。

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

private void showdatetimemethod()

private void form1_load(object sender, eventargs e)

;while (true)

;label1.invoke(showprocess);

//執行緒暫停

thread.sleep(1000);

方法三,使用methodinvoker

再觀察一下上面的**,這個委託型別,輸入引數無輸出引數也無,就可以使用c#的methodinvoker直接構造,關於methodinvoker,msdn給出這樣乙個解釋「表示乙個委託,該委託可執行託管**中宣告為 void 且不接受任何引數的任何方法」

//使用匿名方法2

while (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...