委託在c#中可以看作是物件的一種新型別。一般情況下,我們經常把資料作為引數傳遞給某個方法,但有時某個方法執行的操作並不是指對資料進行操作,而是要對另乙個方法進行操作,這就需要使用委託了。
委託典型的使用場合就是執行緒。當試圖啟動乙個執行緒時,使用的thread.start()方法就必須帶有乙個引數,該引數包含了另乙個方法的內容,即委託方法。
委託的另乙個場合就是事件,gui程式設計主要是處理事件,比如click事件是我們在應用程式中處理的,但是windows是怎樣知道呼叫應用程式的click處理函式來響應click事件的呢?這就是委託的作用。事件實際上是委託的一種特殊形式。
如果從c++程式設計師的角度來理解,乙個委託例項,可以理解成函式指標。但這種直接的函式指標呼叫會導致一些問題,比如型別的安全性,而且在物件導向的程式設計中,方法是無法孤立存在的,它通常需要與類例項相關聯。所以,在c#中,就把這些方法包裝在一種新型別的物件中,即委託。也就是說,委託其實是一種很特殊的物件型別(與類的概念一致)。所不同的是,以前定義的物件都可以包含資料,而委託卻只包含方法簽名。
一、定義委託
定義委託,基本上是定義乙個新類。你可以在定義類的任何地方定義委託,也可以在另乙個類的內部定義乙個委託。定義委託,其語法類似於定義乙個方法,但沒有方法體,定義的前面加上關鍵字delegate即可。
delegate void mydelegate(string sdescription);
如上就定義了乙個帶有string引數,無返回(void)的委託。任何具有這樣簽名格式的方法都可以看成是這個委託的乙個例項,不管這個方法是任何物件上的例項方法或者是靜態方法。
二、委託的呼叫
在呼叫委託之前,你需要先宣告乙個委託,並把它繫結到乙個真正實現的方法上即可。
private delegate void mydelegate(string sdescription);
static void output(string spara)
static void
main
(string args)
於是程式輸出結果"call the delegate."。
另一種委託的呼叫方式就是使用invoke的形式來呼叫,當然兩種呼叫結果是不一樣的。
委託**執行所在的執行緒與呼叫方式相關,下面的例子說明了呼叫方式與執行執行緒的關係。
//定義委託
delegate void mydelegate(string sdesp);
//委託例項
private void dlgtoutput(string sdesp)
private void threadentity());
console.writeline("after invoke");
}private void btnok_click(object sender, system.eventargs e)
程式的輸出是:
直接呼叫委託,thread name=child thread
使用invoke呼叫委託,thread name=main thread
after invoke
可見,不同的呼叫方式,執行委託的執行緒也不一樣。
如果直接呼叫委託,則委託**在子執行緒中執行;
如果使用invoke來呼叫委託,則發現委託**則在主線程中執行。確切地說,當使用invoke呼叫委託時,則在擁有此控制項的基礎視窗控制代碼的執行緒上執行委託。
四、同步與非同步委託
其實,從上面的例子可以看到,在委託中我們故意讓委託sleep(2000)。但發現"after invoke"總是在委託的輸出後面之後才輸出。可見,不管是直接呼叫委託,還是使用invoke呼叫委託的方式,都是同步的。第二種呼叫方式,從windows程式的角度來看,其實就象是子執行緒向主線程使用sendmessage傳送了乙個訊息,它需要最終等待訊息返回,子執行緒才會繼續執行。
如果需要非同步呼叫委託,則需要使用begininvoke的呼叫方式。現在我們修改上面的呼叫: );
console.writeline("after begininvoke");
//等待委託執行完成
this.endinvoke(iasync); }
這次你會發現輸出結果的順序是:
"after begininvoke"
使用begininvoke呼叫委託,thread name=main thread
所以,如果想要委託是非同步執行的,就需要使用begininvoke來呼叫委託,並且非同步委託也必須在擁有控制項執行緒(示例中是主線程)上執行的。非同步呼叫委託就象是向主線程使用postmessage一樣,它不必等待訊息結果就返回了。
可見,對於委託,呼叫方式的不同,不僅會決定了委託執行的執行緒,也決定了委託是否非同步執行。
委託呼叫 子線程程呼叫 與執行緒池呼叫
委託呼叫 子線程程呼叫 與執行緒池呼叫 1,委託呼叫 1 同步委託 委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。從下面的例子中可以看到,同步委託的執行是在主線程main中執行的,所以當執行委託時,當前工作會處於等待狀態...
委託呼叫 子線程程呼叫 與執行緒池呼叫
委託呼叫 子線程程呼叫 與執行緒池呼叫 1,委託呼叫 1 同步委託 委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。從下面的例子中可以看到,同步委託的執行是在主線程main中執行的,所以當執行委託時,當前工作會處於等待狀態...
多執行緒同步與委託,方法的非同步呼叫
執行緒同步即執行緒間對於cpu資源的協調,一次只有乙個執行緒占用資源。進行執行緒同步的方法 1.執行緒1呼叫方法,執行緒2在執行結束後呼叫resume 方法喚醒工作執行緒,此方法需借助sleep 方法協調時間,不靈活。容易出問題,比如執行緒1還沒有suspend 執行緒2就resume 或者後台程序...