转载

.NET委托解析(异步委托)

private static void Main(string[] args)  {        Program.MyPersonDelegate personDelegate = new Program.MyPersonDelegate(Person.GetPersonName);        personDelegate("Static");  }
点击personDelegate查看:
// FuncActionDemo.Program.MyPersonDelegate public virtual extern void Invoke(string name);
我们可以看到委托对象的默认调用方式是Invoke(同步调用).另外我们将它进行反编译查看一下 : 
.NET委托解析(异步委托)

.NET委托解析(异步委托)

我们可以看到委托对象有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中对与并发/异步编程的方式进行了简化,也可以理解为语法糖更丰富了).

.NET解析系列专题目录

正文到此结束
Loading...