上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.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(同步调用).另外我们将它进行反编译查看一下 : 

我们可以看到委托对象有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解析系列专题目录

.NET委托解析(异步委托)的更多相关文章

  1. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件

    通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二).   前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...

  2. C#用委托实现异步,异步与多线程的异同

    异步与多线程的区别(转) 一.异步和多线程有什么区别?其实,异步是目的,而多线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作就没有必要异步了),可以继续自 ...

  3. C# 异步委托(AP、APM)

    Ø  前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...

  4. C# 1.0 新特性之异步委托(AP、APM)

    Ø  前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...

  5. .NET委托解析

    委托这个概念其实我们都很熟悉了,但是在使用的时候很多人还是无法去把控它,我们可以试想一下,在平时编码的时候,你是直接按照业务逻辑直接创建类,new出一个对象来进行操作的还是说有用到委托来更高效的完成一 ...

  6. .NET C#-- 利用BeginInvoke与EndInvoke完成异步委托方法并获取方法执行返回值示例

    //定义委托 delegate string MyDelegate(string name); //定义委托调用函数 public string Hello(string name) { Thread ...

  7. C#固定时间执行指定事件(观察者模式+异步委托)

    最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指 ...

  8. c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调

    单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...

  9. 异步委托(APM)使用Func异步操作,处理耗时操作

    使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: using System; using System.Collections.Generic; using System.Linq; ...

随机推荐

  1. node scripts/install.js 停顿解决办法

    参考:node-sass 安装卡在 node scripts/install.js 解决办法 在安装hexo的时候,运行: npm install hexo-cli -g 卡死在了 node scri ...

  2. DB.使用Oracle时的遇到的问题

    1.(20190225)ojdbc14.jar 来自“E:\ZC_DB\_Connector\Oracle\10g\Oracle Database 10g Release 2 (10.2.0.4) J ...

  3. Java回顾之多线程同步

    在这篇文章里,我们关注线程同步的话题.这是比多线程更复杂,稍不留意,我们就会“掉到坑里”,而且和单线程程序不同,多线程的错误是否每次都出现,也是不固定的,这给调试也带来了很大的挑战. 在这篇文章里,我 ...

  4. 五句话搞定JavaScript作用域【转】

    JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...

  5. npm package.json中的dependencies和devDependencies的区别

    转载:http://www.cnblogs.com/jes_shaw/p/4497836.html 一个node package有两种依赖,一种是dependencies一种是devDependenc ...

  6. UVA-11082 Matrix Decompressing (网络流建模)

    题目大意:给出一个由1到20组成的整数矩阵的每一行和每一列的和,构造这个矩阵.输出任意一个构造方案. 题目分析:将每一行视作一个点x,将每一列视作一个点y.对于矩阵中的每一个格子,都对应一个二元关系& ...

  7. 带你走进脚本世界,ijkplayer之【init-ios.sh】脚本分析

    前言 集成ijkplayer,需要执行脚本init-ios.sh,那么init-ios.sh脚本干嘛用的了,花了半天时间,学习了下shell脚本,感觉脚本语言学起来还是比较容易上手的,现在仅仅能看懂了 ...

  8. IOS-网络(ASI使用)

    ASI与AFN区别 区别: 1.底层实现 1>AFN的底层基于OC的NSURLConnection与NSURLSession 2>ASI的底层基于纯C语言的CFNetWork框架 3> ...

  9. 001——数组(一)数组知识及foreach函数应用

    <?php /**数组(一)数组知识及foreach函数应用*/ /*数组:在一个变量中,存储一个或多个值,每一个元素都有一个访问ID * * */ /* * //索引型数组 $arr=arra ...

  10. RGB2YCbCr RGB2Gray

    Y = 0.2990R+0.5870G+0.1140B;                        Cb=-0.1687R-0.3313G+0.5000B+128;                 ...