C#非同步委託(非同步方法呼叫調用)一:同步調用 : 程式順序執行時-->調用很耗時的[方法]-->阻塞當前線程-->[方法]調用完成-->繼續執行。非同步呼叫 : --------------------------------------------------------------------------------委託例子 : 自寫委託如下 : public delegate String MyDelegate(String name); 微軟會自動提供下面兩個方法 : IAsyncResult BeginInvoke(String name, AsyncResult callback, Object o); String EndInvoke(IAsyncResult result);--------------------------------------------------------------------------------每個委託都有3個方法 : Invoke : 是委託指定函數的同步調用; BeginInvoke : 是非同步呼叫, 調用後立即返回,不等待調用結果 EndInvoke : 是非同步呼叫, 用於檢索調用結果。調用BeginInvoke後可隨時調用, 它將一直阻塞到非同步呼叫完成。AsyncCallback 委託 : 用於指定在開始操作完成後應被調用的方法。IAsyncResult 介面 : 用於監視和管理非同步作業。public interface IAsyncResult{ Object AsyncState { get; } // 該屬性為BeginInvoke參數中的最後一個參數對象 WaitHandle AsyncWaitHandle { get; } // bool CompletedSynchronously { get; } // 如果開始操作調用已同步完成,則其屬性將被設定為 true。 bool IsCompleted { get; } // 該屬性判斷非同步呼叫是否結束}--------------------------------------------------------------------------------例子 : 1) 定義一個委託 : using System.Threading; using System.Runtime.Remoting.Messaging; public delegate int AddHandler(int a,int b); public class 加法類 { public static int Add(int a, int b) { Console.WriteLine("開始計算:" + a + "+" + b); Thread.Sleep(3000); //類比該方法運行三秒 Console.WriteLine("計算完成。"); return a + b; } }2) 同步調用 : 委託的Invoke方法用來進行同步調用。同步調用也可以叫阻塞調用,它將阻塞當前線程,然後執行調用,調用完畢後再繼續向下進行。 public class 同步調用 { static void Main() { Console.WriteLine("===== 同步調用 SyncInvokeTest ====="); AddHandler handler = new AddHandler(加法類.Add); int result = handler.Invoke(1, 2); Console.WriteLine("繼續做別的事情。。。"); Console.WriteLine(result); Console.ReadKey(); } /*運行結果: ===== 同步調用 SyncInvokeTest ===== 開始計算:1+2 計算完成。 繼續做別的事情。。。 3 */ }3) 非同步呼叫 : 非同步呼叫不阻塞線程,而是把調用塞到線程池中,程式主線程或UI線程可以繼續執行。委託的非同步呼叫通過BeginInvoke和EndInvoke來實現。 public class 非同步呼叫 { static void Main() { Console.WriteLine("===== 非同步呼叫 AsyncInvokeTest ====="); AddHandler handler = new AddHandler(加法類.Add); //IAsyncResult: 非同步作業介面(interface) //BeginInvoke: 委託(delegate)的一個非同步方法呼叫的開始 IAsyncResult result = handler.BeginInvoke(1, 2, null, null); Console.WriteLine("繼續做別的事情。。。"); //非同步作業返回 Console.WriteLine(handler.EndInvoke(result)); Console.ReadKey(); } /*運行結果: ===== 非同步呼叫 AsyncInvokeTest ===== 繼續做別的事情。。。 開始計算:1+2 計算完成。 3 */ }4) 非同步回調 : 用回呼函數,當調用結束時會自動調用回呼函數,解決了為等待調用結果,而讓線程依舊被阻塞的局面。 public class 非同步回調 { static void Main() { Console.WriteLine("===== 非同步回調 AsyncInvokeTest ====="); AddHandler handler = new AddHandler(加法類.Add); //非同步作業介面(注意BeginInvoke方法的不同。) IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(回呼函數),"AsycState:OK"); Console.WriteLine("繼續做別的事情。。。"); Console.ReadKey(); } static void 回呼函數(IAsyncResult result) { //result 是“加法類.Add()方法”的傳回值 //AsyncResult 是IAsyncResult介面的一個實作類別,空間:System.Runtime.Remoting.Messaging //AsyncDelegate 屬性可以強制轉換為使用者定義的委託的實際類。 AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate; Console.WriteLine(handler.EndInvoke(result)); Console.WriteLine(result.AsyncState); } /*運行結果: ===== 非同步回調 AsyncInvokeTest ===== 開始計算:1+2 繼續做別的事情。。。 計算完成。 3 AsycState:OK */ }總結 : Invoke方法首先檢查發出調用的線程(即當前線程)是不是UI線程,如果是,直接執行委託指向的方法,如果不是,它將切換到UI線程,然後執行委託指向的方法。