C#委託學習之回撥
阿新 • • 發佈:2019-02-14
委託:
在c#中定義為:委託就像一個函式的指標,在程式執行時可以使用它們來呼叫不同的函式。
我的理解就是一個方法,但是需要傳入的引數型別與普通引數不同,需要傳入另一個方法作為引數。
委託的使用:
首先定義一個委託類:public delegate int MethodDel();
然後例項化一個委託:public MethodDel addMethod = new MethodDel(Add);,其中Add();方法的返回值與引數必須與定義的委託類的返回值和引數相同。
使用時可以新增委託鏈:addMethod += Add2;同理也可以進行減等操作。
委託的呼叫:
委託的呼叫分為同步呼叫、非同步呼叫和非同步回撥。
同步呼叫:即使用Invoke();方法。同步呼叫又稱阻塞呼叫,會阻塞當前執行緒。
非同步呼叫:一步呼叫不會阻塞執行緒,而是把執行緒放到執行緒池中,程式會繼續執行。通過BeginInvoke();和EndInvoke();來實現。
但是如果執行到EndInvoke();時,呼叫沒有執行完畢,依然會阻塞執行緒。
非同步回撥:當呼叫結束時會自動呼叫回到函式,解決了為等待呼叫結果,而讓執行緒依舊被阻塞的局面。
測試程式碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Collections; using System.Runtime.Remoting.Messaging; namespace StudyTest { class Program { public delegate int MethodDel(); public static MethodDel addMethod = new MethodDel(Add); static void Main(string[] args) { Console.ReadKey(); addMethod.Invoke(); Console.WriteLine("同步呼叫完成"); Console.ReadKey(); IAsyncResult resule = addMethod.BeginInvoke(null, null); Console.WriteLine("做別的事情"); Console.ReadKey();//代表做別的事情,再次停頓5秒以上 addMethod.EndInvoke(resule); Console.WriteLine("非同步呼叫完成"); Console.ReadKey(); IAsyncResult resulet = addMethod.BeginInvoke(new AsyncCallback(回撥函式), "AsycState:OK"); Console.WriteLine("做別的事情"); Console.ReadKey(); } public static int Add() { Thread.Sleep(5000);//代表正在呼叫,停止5秒 return 3; } public static void 回撥函式(IAsyncResult result) { addMethod= (MethodDel)((AsyncResult)result).AsyncDelegate; Console.WriteLine(addMethod.EndInvoke(result)); Console.WriteLine(result.AsyncState); } } }