上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源码解析。
首先本文只会从委托的层面的去编写,不会涉及到深层次的异步.(后续的系列中将会对异步进行深入讲解.敬请关注.).
委托的异步调用方式
在上一篇中我们在实例中是直接通过委托对象的,例如:
private static void Main(string[] args) { Program.MyPersonDelegate personDelegate = new Program.MyPersonDelegate(Person.GetPersonName); personDelegate("Static"); }
点击personDelegate查看:
// FuncActionDemo.Program.MyPersonDelegatepublic virtual extern void Invoke(string name);
我们可以看到委托对象的默认调用方式是Invoke(同步调用).另外我们将它进行反编译查看一下 :
我们可以看到委托对象有void Invoke , System.IAsyncResult BeginInvoke,void EndInvoke . 这三个构造函数,我们下面先解释一下这三个构造:
Invoke : 委托回调函数时候的一种同步调用方式.
BeginInvoke : 委托回调函数时候的一种异步调用方式.和Invoke对立
EndInvoke : 异步调用,用于检索调用结果.
在IT,特别是编程界,概念往往是不容易理解的,当然除非你是具备超强的功底.否则还是通过实例来验证一下为好:
public delegate void delegateTest(string str);static void Main(string[] args) { delegateTest test = new delegateTest(GetIntance); IAsyncResult result = test.BeginInvoke("这是异步执行的", null, null); test.EndInvoke(result); Console.WriteLine("这是同步执行的"); Console.ReadLine(); //test.BeginInvoke("", new AsyncCallback((result) => Console.WriteLine("")), null); //Console.WriteLine(@"异步执行的同时并没有影响我的执行"); //Console.WriteLine(@"异步执行的同时并没有影响我的执行2"); //Console.ReadLine();}private static void GetIntance(string str) { Console.WriteLine(str); }
在上述代码中,我们声明了一个委托delegateTest, 和一个静态方法GetIntance并有一个string类型的形参, 然后在Main函数中,我们创建了一个委托实例,并回调了GetIntance,通过委托实例的BeginInvoke来异步执行GetIntance,通过BeginInvoke的第一个参数为GetIntance的实参( 注意:BeginInvoke的参数,最后两个分别为 : CallBack,Object,然后首个参数更明确的说是BeginInvoke的参数根据委托类型的的参数而定. )之后我们在通过test.EndInvoke(result);来判断异步是否执行完成,前面我们说过EndInvoke的作用就是用来判断BeginInvoke是否执行完成,如果执行完成才继续执行下一步如果没有完成则等待.,通过如果我们将EndInvoke去掉,那么最后调用的结果肯定为 : "这是同步执行的" --> "这是异步执行的" . 那么我们加上EndInvoke的话最后的输出结果为:"这是异步执行的" --> "这是同步执行的"; ( 如果大家有异步的概念,对于这个其实很好了解的,关于异步在接下来的系列中会着重编写. ,首先异步和并发是密不可分的,其次在目前的研发中来讲并行编程也是提高生产效率的一种可行性方式,最后微软在C#5.0中对与并发/异步编程的方式进行了简化,也可以理解为语法糖更丰富了).