BeginInvoke和EndInvoke的作用是把一個同步方法改成非同步執行,改造過程主要有3步:
·增加一個與方法對應的委託;
·增加一個AsyncCallback委託類型的回呼函數(在函數體調用EndInvoke擷取傳回值);
·將方法的參數、回呼函數和委託變數傳給BeginInvoke;
下面是一個簡單的樣本:
代碼如下 |
複製代碼 |
public class Test { /// <summary> /// 原始方法 /// </summary> /// <returns></returns> private int Todo() { return 100; }
/// <summary> /// 增加方法對應的委託 /// </summary> /// <returns></returns> delegate int TodoHandler(); /// <summary> /// 增加AsyncCallback委託類型的回呼函數 /// </summary> /// <param name="ar"></param> private void TodoCallback(IAsyncResult ar) { TodoHandler handler = (TodoHandler)ar.AsyncState; Console.WriteLine(handler.EndInvoke(ar)); } /// <summary> /// 調用樣本 /// </summary> public void InvokeTest() { TodoHandler handler = new TodoHandler(Todo); handler.BeginInvoke(TodoCallback, handler); } } |
參考很多類非同步方法呼叫命名方式BeginXXX和EndXXX,對上面類稍做修改:
代碼如下 |
複製代碼 |
public class Test { public int Todo(int a, int b) { return a + b; }
private delegate int TodoHandler(int a, int b); private TodoHandler _todo = null; public Test() { _todo = Todo; } public IAsyncResult BeginTodo(int a, int b, AsyncCallback callback, object state) { return _todo.BeginInvoke(a, b, callback, state); } public int EndTodo(IAsyncResult ar) { return _todo.EndInvoke(ar); } } public class Program { static void TodoCallback(IAsyncResult ar) { Test test = (Test)ar.AsyncState; Console.WriteLine(test.EndTodo(ar)); } static public void Main(string[] args) { Test test = new Test(); test.BeginTodo(2, 3, TodoCallback, test); Console.ReadKey(); } } |
BeginTodo方法傳回型別為IAsyncResult,網上看到有人這麼調用:
代碼如下 |
複製代碼 |
static public void Main(string[] args) { Test test = new Test(); IAsyncResult result = test.BeginTodo(2, 3, null, null); Console.WriteLine(test.EndTodo(result));
Console.ReadKey(); } |