委託的呼叫方法與執行執行緒

2021-04-12 23:30:38 字數 2390 閱讀 3732

委託在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 或者後台程序...