上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.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. BCG控件初步领略

    BCGPVisualStudioGUIDemo 这个界面很不错呀,如果能够实现这种效果,能够解决系列问题 画图程序,这种界面非常先进.用于石材大板等非常优秀. email的效果 这种东西如果效果不错, ...

  2. 2018-2019-1 20189215 《Linux内核原理与分析》第七周作业

    <庖丁解牛>第六章书本知识总结 操作系统内个实现操作系统的三大管理功能:进程管理.内存管理.文件系统.分别对应<操作系统原理>中最重要的3个抽象概念是进程.虚拟内存和文件. L ...

  3. 20145319 《网络渗透》MS12_020安全漏洞

    20145319 <网络渗透>MS12_020安全漏洞 一 实验内容 初步掌握平台matesploit辅助模块aux的使用 辅助模块包括扫描等众多辅助功能 本次展示DOS攻击的实现 有了初 ...

  4. git将多个commit合并成一个新的commit

    问题: 有以下commit: 323udd ede234 6e7s6e 要合并第一个和第二个commit 方法有二: 方法一 使用git rebase -i hash-id,-i表示以交互模式进行co ...

  5. Git WorkBehavior

    https://tortoisegit.org/docs/tortoisegit/tgit-dug-showlog.html Repository Demo https://github.com/Ch ...

  6. BZOJ 2342: 【SHOI2011】 双倍回文

    题目链接:双倍回文 回文自动机第二题.构出回文自动机,那么一个回文串是一个“双倍回文”,当且仅当代表这个串的节点\(u\)顺着\(fail\)指针往上跳,可以找到一个节点\(x\)满足\(2len_x ...

  7. hdu 4745 Two Rabbits 区间DP

    http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...

  8. hdu 5687 Problem C trie树

    Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Prob ...

  9. redis优缺点

    redis主要是一个内存数据库.很多时候是被作为缓存来使用.redis的优势主要体现在和其他缓存方案进行比较,redis的不足主要是和其他数据库进行比较时体现的. 优点: 读写性能优异 支持数据持久化 ...

  10. vue 脚手架(二,项目依赖说明 package.json)

    本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 继续上一篇, 上一篇讲了 vue ...