【读书笔记】关于《精通C#(第6版)》与《C#5.0图解教程》中的一点矛盾的地方
这几天无聊看书,《精通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赞的答案,答案给了一个连接:
简单的看看了,文章中说是一个大佬长期误导了一些人,
理论上:
“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图解教程》中的一点矛盾的地方的更多相关文章
- 【Todo】【读书笔记】机器学习实战(Python版)
还是把这本书的读书笔记,单独拎出来吧,因为内容比较多. P38. Logistic 回归. 觉得还蛮实用的.囫囵吞枣看的.要细看.
- [读书笔记]Hadoop权威指南 第3版
下面归纳概述了用于设置MapReduce作业输出的压缩格式的配置属性.如果MapReduce驱动使用了Tool接口,则可以通过命令行将这些属性传递给程序,这比通过程序代码来修改压缩属性更加简便. Ma ...
- 【C#4.0图解教程】笔记(第19章~第25章)
第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板. 2.声明 ...
- 【C#4.0图解教程】笔记(第9章~第18章)
第9章 语句 1.标签语句 ①.标签语句由一个标识符后面跟着一个冒号再跟着一条语句组成 ②.标签语句的执行完全如同标签不存在一样,并仅执行冒号后的语句. ③.给语句添加一个标签允许控制从代码的另一部分 ...
- 【C#4.0图解教程】笔记(第1章~第8章)
第1章 C#和.NET框架 1..NET框架的组成 .NET框架由三部分组成(严格来说只有CLR和FCL(框架类库)两部分),如图 执行环境称为:CLR(公共语言运行库),它在运行期管理程序的执行. ...
- Sprint总结和第八九十的读书笔记
总结:经过这次的Sprint,我在从中收获了很多.作为产品负责人的我,主要责任就是合理分配任务给自己的队友,调动队友的积极性.虽然这其中也有些不尽人意的地方,但是我们都坚持的走了过来,团队合作真的很重 ...
- 《沉静领导》读书笔记zz
就 像作者说的,这本书“只是一篇简单的随笔,它描绘并阐明了一种关于领导之道的思考方式,并且为把这种思考方式应用到实际行动中提供了指南.”但是,仔细想 来,倒有一点不同见解,或许,它描述的不可以叫做“领 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 《JavaScript面向对象编程指南(第2版)》读书笔记(一)
目录 一.对象 1.1 获取属性值的方式 1.2 获取动态生成的属性的值 二.数组 2.1 检测是否为数组 2.2 增加数组长度导致未赋值的位置为undefined 2.3 用闭包实现简易迭代器 三. ...
随机推荐
- python 连接 SQL Server 数据库
#!/usr/bin/python # -*- coding:utf-8 -*- import pymssql import pyodbc host = '127.0.0.1:1433' user = ...
- DEVOPS技术实践_02:jenkins自动构建项目
一.用户名密码错误 打开jenkins发现用户名密码错误,解决 1.1 找到config.xml文件 [root@jenkins-master ~]# ll -a drwxr-xr-x. root r ...
- no supported authentication methods avaiable
在git(小乌龟)向github远程推送(push)文件是会报一个异常 no supported authentication methods avaiable 解决方法:因为git(小乌龟)和Git ...
- 使用 Python 中 re 模块对测试用例参数化,进行搜索 search、替换 sub
自动化测试用例,如果一百个接口要在Excel写100个sheet表单,每个接口有10个字段,里面有5个都可能是变化的,需要使用参数化,先试用特定的字符进行站位,在构造参数时在进行替换占位符: 一.用力 ...
- Maven 生命周期的概念(指令默认顺序执行)
生命周期的概念 IDEA中使用maven构建项目都集中放到了窗口右侧"Maven Projects"中,点击该区域可以直观的看到,maven中几个常用指令都归类为LifeCycle ...
- 用TensorFlow做图像识别(python)
一.TensorFlow简介 TensorFlow是由谷歌开发的一套机器学习的工具,使用方法很简单,只需要输入训练数据位置,设定参数和优化方法等,TensorFlow就可以将优化结果显示出来,节省了很 ...
- 手把手带你了解消息中间件(3)——RocketMQ
一.RocketMQ简介 RocketMQ作为一款纯java.分布式.队列模型的开源消息中间件,支持事务消息.顺序消息.批量消息.定时消息.消息回溯等. 二.RocketMQ架构 如图所示为R ...
- 【linux学习笔记】
网上看一个两小时突击linux的教程,就想补充一下linux的知识.想着一天抽出俩小时立马就能学完呢,结果乱七八糟的事情拖了四五天,实际完成某项任务的时间超出预期完成任务的两部不止.好了," ...
- 解决elment 动态多选框组(el-checkbox-group)无法设置默认值问题
<el-checkbox-group v-model="form.showProperty"> <el-checkbox v-for="(item,id ...
- Sentinel :微服务哨兵
1. Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentin ...