非同步 同步委託解析(一)

2021-09-22 06:45:12 字數 1504 閱讀 3126

委託的定義想必大家都知道,它本質上是乙個類,我們定義乙個委託:

1delegate

intdecrement(

intx,

inty);

經過編譯後,編譯器自動生成乙個從multicastdelegate繼承下來的密封類:

1sealed

class

decrement:multicastdelegate2

那麼,decrement這個類中應該包含哪些成員呢?經過分析,編譯器給我們生成的完整的decrement類應該是這樣的:

我們知道,multicastdelegate類從delegate類繼承而來,他們都是abstract的,但是我們不能顯示從他們派生新的類,只能由編譯器做這個事情,檢視msdn,我們知道delegate類有兩個重要的公開屬性:target 、method,其中target是object型別的,method是system.reflection.methodinfo型別的(這個型別通常指乙個方法,如果大家熟悉反射,就應該很清楚了),其中,method指該委託所繫結的方法,即建立委託變數時,傳給建構函式的引數,這個引數通常是乙個函式名,target指與method繫結的物件,如果我們這樣建立乙個委託變數:decrement  d=new decrement(obj.function);其中obj是乙個物件,function是obj的成員函式,完了後,target就指obj物件了,method就指function函式了。

好了,知道decrement委託的真實面貌之後,我們再來分析我們「從建立委託變數,到呼叫委託方法」的過程。

以上是乙個委託非常簡單但普遍的運用方法,下面我們來分析一下該過程:

1)、第一步,我們定義乙個委託:delegate

intdecrement(

intx,

inty);編譯器為我們定義乙個類:sealed

class

decrement:multicastdelegate;

2)、第二步,我們建立乙個委託變數:decrement mydelegate=

newdecrement(function);相當於定義乙個decrement類的物件,同時呼叫它的建構函式,將function賦給method成員,target為null,當然,如果我們傳給建構函式的是乙個例項方法,也即這樣傳參:decrement mydelegate=new decrement(obj.function)的,那麼target就為obj;

3)、第三步,建立完委託變數之後,我們就要運用它了:int result=mydelegate(10,8),其實,當我們寫下這一句**時,實際呼叫的是mydelegate.invoke(10,8)這個成員函式,該方法是乙個同步阻塞的,即直到function方法執行完之後,該方法才返回,同時返回function執行的結果。

好了,三步剛好,我們要研究的是這個invoke方法它是怎樣阻塞的!!

為了更好分析這個問題,我們再稍微改一下上面的那個委託應用例項:

出處:

標籤: 

委託, 

非同步, 

同步

事件 委託 非同步同步

1 理解事情和委託是怎麼來的,為什麼要有委託,委託結合事情的魅力所在 2 ui執行緒中怎麼正確呼叫同步委託或非同步委託 invoke和begininvoke的區別是什麼 control.invoke和delegate.invoke有什麼區別?事件和委託原理的理解解析 invoke和begininvo...

解析(一) 同步 非同步

目錄 同步 非同步 注 參考 問題 一 請說明一下執行緒中的同步和非同步有何異同?並且請舉例說明在什麼情況下會使用到同步和非同步?兩個程序間的訊息隱含著某種程式的同步 只有當乙個程序傳送出訊息之後,接受者才能接收訊息。且當乙個程序產生了send或者receive原語後,需要確定會發生什麼。即發出乙個...

解析C 中委託的同步呼叫與非同步呼叫 例項詳解

委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。同步呼叫的例子 複製 如下 using system using system.threading public delegate int addhandler int a,...