.NET委托解析(异步委托)
上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.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委托解析(异步委托)的更多相关文章
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)。 异步委托 微信小程序支付证书及SSL证书使用 SqlServer无备份下误删数据恢复 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中 通过XDocument方式把List写入Xml文件
通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的脾气秉性(二). 前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span的本质(一).>,相信大家对sp ...
- C#用委托实现异步,异步与多线程的异同
异步与多线程的区别(转) 一.异步和多线程有什么区别?其实,异步是目的,而多线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作就没有必要异步了),可以继续自 ...
- C# 异步委托(AP、APM)
Ø 前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...
- C# 1.0 新特性之异步委托(AP、APM)
Ø 前言 C# 异步委托也是属于异步编程中的一种,可以称为 Asynchronous Programming(异步编程)或者 Asynchronous Programming Model(异步编程模 ...
- .NET委托解析
委托这个概念其实我们都很熟悉了,但是在使用的时候很多人还是无法去把控它,我们可以试想一下,在平时编码的时候,你是直接按照业务逻辑直接创建类,new出一个对象来进行操作的还是说有用到委托来更高效的完成一 ...
- .NET C#-- 利用BeginInvoke与EndInvoke完成异步委托方法并获取方法执行返回值示例
//定义委托 delegate string MyDelegate(string name); //定义委托调用函数 public string Hello(string name) { Thread ...
- C#固定时间执行指定事件(观察者模式+异步委托)
最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指 ...
- c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调
单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...
- 异步委托(APM)使用Func异步操作,处理耗时操作
使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: using System; using System.Collections.Generic; using System.Linq; ...
随机推荐
- Vue学习笔记之Vue的对象单体模式
0x00 对象的单体模式 为了解决箭头函数this指向的问题 推出来一种写法 对象的单体模式 var person = { name:'小马哥', age:12, fav(){ console.log ...
- Docker 版本升级
当前系统版本:Centos 7.4 x64 删除老版本docker sudo yum remove docker docker-common docker-selinux docker-engine ...
- ThinkPHP5 快速入门文档
一. 5.0版本采用模块化的设计架构,默认的应用目录下面只有一个index模块目录,如果我要添加新的模块可以使用控制台命令来生成. 切换到命令行模式下,进入到应用根目录并执行如下指令: php thi ...
- js 逗号操作符
有一道js面试题,题目是这样的:下列代码的执行结果是什么,为什么? var i, j, k; for (i=0, j=0; i<10, j<6; i++, j++) { k = i+j; ...
- JS封装简单后代选择器
大概思路是这样的:通过判断传过来的参数是什么类型,如果是对象,那这里就是this(因为封装是自己用的,肯定不会随便乱传一个对象过来),如果是一个函数(匿名函数),那就是Dom加载(这里先不讲),如果是 ...
- pod状态为Back-off
查看pod状态为CrashLoopBackOff [root@master yaml]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-7 ...
- 解决 Faster R-CNN 图片中框不在一张图片上显示的问题
目录 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 如何解决这个问题? 参考issues 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 在使 ...
- js获取当前日期加上30天之后的日期
var date1 = new Date(); var date2 = new Date(date1); date2.setDate(date1.getDate() + 30); console.lo ...
- SQL 字符串拆分
字符串拆分: ALTER FUNCTION [dbo].[f_Split](@sText nvarchar(max),@split NVARCHAR(20)) RETURNS @t TABLE (id ...
- L172 K-kilogram
In a historic vote, nations on Friday unanimously approved a groundbreaking overhaul to the internat ...