委托:
在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); } }}
新聞熱點
疑難解答