首先,先理清出一个概念:
delegate 与Delegate有什么区别?
Delegate:是一个抽象基类,它引用静态方法或引用类实例及该类的实例方法。然而,只有系统和编译器可以显式地从 Delegate 类派生出委托类型。
MulticastDelegate:是一个继承于Delegate的类,其拥有一个带有链表格式的委托列表,该列表称为调用列表,在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。平常我们声明一个delegate的类型,都是继承于MulticastDelegate类的(注意:不能显式地从此类进行派生。这点与Delegate类是一样的,只有系统和编译器也可以显示地进行派生)。
delegate 是一个C#关键字,用来定义一个新的委托类型(继承自MulticastDelegate类)。
其中IAsyncResult的 CompletedSynchronously属性不是很明白
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Runtime.Remoting.Messaging; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Func<int> Fuc = () => { int i = 5; while (i>=0) { Console.WriteLine("----------"+i); i--; Thread.Sleep(500); } return 6; }; ManualResetEvent re= new ManualResetEvent(false); var iarOut= Fuc.BeginInvoke( (iar) => { //AsyncState可以得到传入参数,这里即"Test" //一般也可以传入调用函数自身,可以免去转化AsyncResult来得到 var parm = iar.AsyncState as string; Console.WriteLine("Pram:"+parm); //要将传递过来的IAsyncResult的参数转化为AsyncResult //才能得到原调用方法 AsyncResult ar = iar as AsyncResult; var caller = ar.AsyncDelegate as Func<int>;//得到调用方法,即Fuc //调用EndInvoke会阻塞线程直到方法执行完毕,这里是执行完毕的回调不会阻塞 var returnValue = caller.EndInvoke(iar); Console.WriteLine("Result:"+returnValue); re.Set(); }, "Test"); //等待回调方法执行完毕后才继续执行 re.WaitOne(); Console.WriteLine("----------Complete"); } } }