C 委託與執行緒通訊

2021-09-27 09:53:31 字數 1152 閱讀 4603

1、c#中的委託機制我簡單理解為c++中的函式指標。

用法如下: 

使用委託: 

public delegate string messagedelegate(string message);

public class m

}class program

}

委託的定義很明顯,他的返回型別和引數需要和被委託的方法一致,呼叫的時候,為 :  物件.方法(引數)

這是簡單的委託的使用,委託更上面一級是事件,我理解為把委託進行封裝,使用乙個物件來管理一定數量的委託。

乙個事件可以繫結多個委託,通過操作符"+=" 、" -="來增加和刪除委託(繫結和解綁)具體語法就不再講了。

2、關於使用委託來進行執行緒通訊,我不知道我的理解對不對,但是我確實是這麼做的,而且達到了預期的效果。

一般程式中線程之間的通訊,可以使用全域性變數來進行,但是這樣得設定全域性變數為volatile。

或者可以通過socket來進行通訊(具體socket的底層原理,實現**等,不講了,我也沒怎麼了解過。)

還可以通過委託來進行。

這個時候,我們可以在處理業務邏輯**這一部分開啟乙個執行緒,form視窗乙個執行緒,如果把這兩個執行緒放在同乙個上下文中並使用全域性變數,我感覺**會很臃腫,而且不優雅。但是如果在業務邏輯執行緒中對form控制項進行操作,兩個執行緒是無法進行通訊的,會拋異常。

當然,c#提供了乙個避免拋異常的解決辦法:

form.checkforillegalcrossthreadcalls = false;
這一行**可以讓.net不捕捉執行緒之間非法訪問的異常(設定為true則捕捉,false則不捕捉),但是這種方式不推薦。

我們可以通過委託的方式來使業務邏輯執行緒操作form執行緒中的控制項。;

this.begininvoke(act);

// this.invoke(act);}

invoke和begininvoke,乙個是同步執行委託,乙個是非同步執行委託。

action類的作用是封裝乙個無引數也無返回值的委託型別方法,通過這個委託,即可以實現另外乙個執行緒訪問form執行緒中的控制項。但是這種方法有乙個缺點,它執行的時候需要切換上下文,這使得他的資源利用率會比較低。

c 執行緒與委託

執行緒建立的四種方法 using system using system.threading namespace thread test 2.帶引數的委託 public void createthreadwithparamthreadstart 3.匿名函式 public void createth...

子執行緒與UI執行緒的通訊 委託

由於專案中存在這樣的載入的畫面 在介面上有顯示載入資訊的 label 控制項和進度條,如果採用單執行緒則在載入資料的時候 ui介面會被鎖死,造成假死的感覺。為了給乙個更友好的介面,因此有必要引入多執行緒技術,使得軟體更加 人性化 但隨後在子執行緒中訪問介面上的控制項的時候會出現異常,不能操作主線程所...

c 委託與多執行緒

很多時候寫windows程式都需要結合多執行緒,在.net中用如下得 來建立並啟動乙個新的執行緒。public void threadproc thread thread new thread new threadstart threadproc thread.isbackground true t...