異步委托提供以異步方式調用同步方法的能力。當同步調用一個委托時,“Invoke”方法直接對當前線程調用目標方法。如果編譯器支持異步委托,則它將生成“Invoke”方法以及“BeginInvoke”和“EndInvoke”方法。如果調用“BeginInvoke”方法,則公共語言運行庫 (CLR) 將對請求進行排隊並立即返回到調用方。將對來自線程池的線程調用該目標方法。提交請求的原始線程自由地繼續與目標方法並行執行,該目標方法是對線程池線程運行的。如果在對“BeginInvoke”方法的調用中指定了回調方法,則當目標方法返回時將調用該回調方法。在回調方法中,“EndInvoke”方法獲取返回值和所有輸入/輸出參數。如果在調用“BeginInvoke”時未指定任何回調方法,則可以從調用“BeginInvoke”的線程中調用“EndInvoke”。
使用用戶指定的委托簽名,編譯器應發出具有“Invoke”、“BeginInvoke”和“EndInvoke”方法的委托類。“BeginInvoke”和“EndInvoke”方法應被修飾為本機的。因為這些方法被標記為本機的,所以 CLR 在類加載時自動提供該實現。加載程序確保它們未被重寫。
NET Framework 允許您異步調用任何方法。為此,應定義與您要調用的方法具有相同簽名的委托;公共語言運行庫會自動使用適當的簽名為該委托定義 BeginInvoke 和 EndInvoke 方法。
BeginInvoke 方法可啟動異步調用。它與您需要異步執行的方法具有相同的參數,另外它還有兩個可選參數。第一個參數是一個 AsyncCallback 委托,該委托引用在異步調用完成時要調用的方法。第二個參數是一個用戶定義的對象,該對象可向回調方法傳遞信息。BeginInvoke 立即返回,不等待異步調用完成。BeginInvoke 會返回 IAsyncResult,這個結果可用於監視異步調用進度。
EndInvoke 方法檢索異步調用的結果。調用 BeginInvoke 後可隨時調用 EndInvoke 方法;如果異步調用尚未完成,EndInvoke 將一直阻止調用線程,直到異步調用完成後才允許調用線程執行。EndInvoke 的參數包括您需要異步執行的方法的 out 和 ref 參數(在 Visual Basic 中為 <Out>ByRef 和 ByRef)以及由 BeginInvoke 返回的 IAsyncResult。
1 using System;