志铭-2020年2月8日 03:32:03

这几天无聊看书,《精通C#》和《C#图解教程》,几本书对比者看,都是旧版本的书,发现两本书中的一个矛盾的地方:

《精通C#(第6版)》P571:说明:“如果异步调用一个无返回值的方法,仅仅调用BeginInvoke()就可以了。在这种情况下,我们不需要缓存IAsyncResult兼容对象,也不需要首先调用EndInvoke()(因为没有收到返回值)。”

《C#5.0图解教程》P432:说明:“因为EndInvoke是为开启的线程进行清理,所以必须确保对每一个BeginInvoke都调用EndInvoke。”

两本书中对此的观点不一样。


这是一个旧问题,很久很久以前大家就讨论了,

哈哈哈,而且这是一个很无聊的问题,!

只是以前我不了解,今天我遇到了,故记录于此。

其实关于BeginInvoke()和EndInvoke()是否一定要配对使用,是不是可以省略EndInvoke()的讨论有很多,而且现在几乎就没有人在查阅这个问题了,因为现在大家都不在使用APM异步编程模式了!

但是既然我遇到了,那我就查一查呗

网上讨论可以参考:

博客园:BeginInvoke 如果不调用EndInvoke会怎么样?

CSDN : C#异步委托BeginInvoke是否必须和EndInvoke成对调用?

路人甲说:BeginInvoke()和EndInvoke()必须配对使用,以便清理线程池资源,

路人乙说:只要你不需要接收异步操作的返回值且不查看异步操作的状态就可以不调用EndInvoke(),而且即使不用EndInvoke()清理线程,GC也会很快的清理用完的Delegate对象。

查阅StackOverFlow:Is EndInvoke() optional, sort-of optional, or definitely not optional?

可以看到最高赞答案如下,截图翻译了一下:

简单的说在MSDN中两中说法都有,写不写都可以!

好吧,一般我查阅问题可能就得出结论了,嘿嘿,但是我手贱又看了下面的一个18赞的答案,答案给了一个连接:

文章连接EndInvoke Not Optional,

简单的看看了,文章中说是一个大佬长期误导了一些人,

理论上:
CAUTION Always call EndInvoke after your asynchronous call completes.”(注意,异步调用完成后一定要调用EndInvoke)

其次,文章提到:
Microsoft obviously have the right to relax this requirement in the future if they want to, but for now, you have to call EndInvoke.

简单的翻译一下:微软显然有权利在将来放宽这一要求,但现在,您必须调用EndInvoke(哈哈,这句是2005年以前的情形,现在如何,就不考证了,嘿嘿!)

其实呀,简而言之,调用EndInvoke一定没坏处


我的理解就是,在没有返回值的引用函数时实现异步,不使用EndInvoke,

就是相当于async & await关键字实现返回值为void的异步方法,

即不需要对该异步方法进一步交互,称之为:调用并忘记(fire and forget),

许多时候异步编程就是需要这样呀!只是现在我们一般都不使用APM模式罢了!

【读书笔记】关于《精通C#(第6版)》与《C#5.0图解教程》中的一点矛盾的地方的更多相关文章

  1. 【Todo】【读书笔记】机器学习实战(Python版)

    还是把这本书的读书笔记,单独拎出来吧,因为内容比较多. P38. Logistic 回归. 觉得还蛮实用的.囫囵吞枣看的.要细看.

  2. [读书笔记]Hadoop权威指南 第3版

    下面归纳概述了用于设置MapReduce作业输出的压缩格式的配置属性.如果MapReduce驱动使用了Tool接口,则可以通过命令行将这些属性传递给程序,这比通过程序代码来修改压缩属性更加简便. Ma ...

  3. 【C#4.0图解教程】笔记(第19章~第25章)

    第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板.   2.声明 ...

  4. 【C#4.0图解教程】笔记(第9章~第18章)

    第9章 语句 1.标签语句 ①.标签语句由一个标识符后面跟着一个冒号再跟着一条语句组成 ②.标签语句的执行完全如同标签不存在一样,并仅执行冒号后的语句. ③.给语句添加一个标签允许控制从代码的另一部分 ...

  5. 【C#4.0图解教程】笔记(第1章~第8章)

    第1章 C#和.NET框架 1..NET框架的组成 .NET框架由三部分组成(严格来说只有CLR和FCL(框架类库)两部分),如图 执行环境称为:CLR(公共语言运行库),它在运行期管理程序的执行. ...

  6. Sprint总结和第八九十的读书笔记

    总结:经过这次的Sprint,我在从中收获了很多.作为产品负责人的我,主要责任就是合理分配任务给自己的队友,调动队友的积极性.虽然这其中也有些不尽人意的地方,但是我们都坚持的走了过来,团队合作真的很重 ...

  7. 《沉静领导》读书笔记zz

    就 像作者说的,这本书“只是一篇简单的随笔,它描绘并阐明了一种关于领导之道的思考方式,并且为把这种思考方式应用到实际行动中提供了指南.”但是,仔细想 来,倒有一点不同见解,或许,它描述的不可以叫做“领 ...

  8. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  9. 《JavaScript面向对象编程指南(第2版)》读书笔记(一)

    目录 一.对象 1.1 获取属性值的方式 1.2 获取动态生成的属性的值 二.数组 2.1 检测是否为数组 2.2 增加数组长度导致未赋值的位置为undefined 2.3 用闭包实现简易迭代器 三. ...

随机推荐

  1. Java泛型类特性

    在2004年末Java推出了Java5,其中提供了对泛型方法和类的支持,也围绕着泛型推出了一下特性,本章将对Java泛型进行综合的概括 1.泛型特性构件pre-Java 5 1.使用Object表示泛 ...

  2. Netty堆外内存泄漏排查,这一篇全讲清楚了

    上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...

  3. tomcat日志传参乱码问题

    问题:      在centos系统下,tomcat8.0.36控制台日志打印会出现中文乱码. 解决方案:      在catalina.sh里加上 JAVA_OPTS="-Dfile.en ...

  4. 使用Django进行后端开发

    目录 更换pip源 搭建虚拟环境 项目目录设置 项目相关配置 更换pip源 更换pip源 搭建虚拟环境 搭建虚拟开发环境 项目目录设置 项目目录设置 项目相关配置 项目相关配置

  5. 如何让接口文档自动生成,SpringBoot中Swagger的使用

    目录 一.在SpringBoot项目中配置Swagger2 1.pom.xml中对Swagger2的依赖 2.编写配置类启用Swagger 3.配置实体类的文档 4.配置接口的文档 5.访问文档 二. ...

  6. 「CodeForces 546B」Soldier and Badges 解题报告

    CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...

  7. 啊哈!C语言课后参考答案下

    最近看到一本好评量很高的的C语言入门书,课本真的很好,入门的话.专业性没有那么强,但入门足够了!!好评!看着看着就想把这本书的题课后习题都写出来,最后就有了这个小结.可能有的不是最好,不那么专业,但主 ...

  8. HashMap中的位运算

    二进制基础回顾 以下操作相对正整数的二进制而言,对非整数不太适用. 二进制转十进制   在二进制中,位权是2的幂,所以每一位所代表的权值从右到左分别为2^(1-1) .2^(2-1) .... . 2 ...

  9. 迷你PS小程序-集成的开放式画报、油墨电子签名、图片拖拽可单独食用

    米娜桑,哦哈哟~ 个人制作,该文章主要讲解最近基于uni-app框架编写的集图文拖拽等多方位编辑.油墨电子签名.开放式海报于一体的小程序的制作思路和实现代码. 目录 1.完整源码链接 2.实现思路 3 ...

  10. 让vue-router渲染为指定的标签

    <router-link :to="{name:'cart'}" tag="li"> cart </router-link> 在rout ...