异步模型(APM)的注意事项
一、在没有线程池的前提下使用APM
APM可以让线程池在异步操作完成时调用指定的回调方法。它使用很少的资源,并提供了出色的性能,然而,APM 还允许通过另外三种方式发现异步操作在何时完成。
首先,如果一个线程在操作完成之前调用 EndXXX 方法,并传递 IAsyncResult 对象,调用线程会阻塞并等待操作完成。EndXXX 返回的结果会将线程唤醒。其次可以查询 IAsyncResult 的AsyncwaitHandle属性,从而得到一个WaitHandle,再在这个 WaitHandle 上调用 WaitOne,从而是一个线程阻塞等待操作完成。但是这两种操作都应该避免,因为它们会阻塞线程,可能造成线程池分类另一个线程。
第三、一个线程可以再一个循环中连续的查询 IAsyncResult 的IsCompleted 属性,从而发现操作何时完成。但轮询会浪费 CPU 时间。
二、不能取消异步 I/O 限制操作
目前没有办法取消一个正在进行的异步 I/O 限制操作。当然对于我们来说是想要这样一个功能的,但实现起来却是非常难,目前还没有看到相关例子。毕竟,如果从服务器器请求1000字节,然后又决定不再需要这些数据,其实没办法告诉服务器忘掉你的请求。在这种情况下,只能让字节照常返回,再将他们丢弃。此外,这里还存在一个竞态条件,你的取消指令可能是正在读取最后一个字节到达的。
三、内存消耗
任何时候调用 begin 异步方法,它都构造实现了IAsyncResult接口的一个实例。这意味着针对想要执行的每个异步操作,都会创建一个对象。这回增加一些开销,并在堆中创建较多的对象,导致发生更多的垃圾回收。最终的结果就是应用程序的性能变差了。因此,如果知道自己的 I/O 操作执行非常快,那么以同步方式可能更合理。
四、关于FileStream 特有的问题
创建一个 FileStream 对象时,可通过FileOptions.Asynchronous 标志指定以同步还是异步方式进行通信。这等价于调用 Win32 CreateFile 函数,并向他传递 FILE_FLAG_OVERLAPPED 标志。如果不指定这个标志。Windows 一同步方式执行所有的文件操作。当然,你仍可以使用BeginRead方法异步读取。对于应用程序来说,操作表面是异步的,但 FileStream类在内部是用另一个线程模拟异步行为。这个额外的线程纯属浪费,而且会影响到性能。
另外一个方面,可以创建 FileStream 对象时指定FileOptions.Asynchronous 标志,然后,可以调用 FileStream 的 Read 方法执行一个同步操作。在内部,FileStream 类会开始一个异步操作,然后立即调用线程进行休眠状态,知道操作完成才会被唤醒,从而来模拟同步行为。效率更加地下。但对于上面一种方式,它的效率还稍微高一点的。
异步模型(APM)的注意事项的更多相关文章
- 转:[你必须知道的异步编程]——异步编程模型(APM)
本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中介绍了从C#1.0——C#4.0中一些 ...
- [你必须知道的异步编程]——异步编程模型(APM)
本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中 介绍了从C#1.0——C#4.0中一 ...
- 一、异步编程模型(APM)
一.概念 APM即异步编程模式的简写(Asynchronous Programming Model).大家在写代码的时候或者查看.NET 的类库的时候肯定会经常看到和使用以BeginXXX和EndXX ...
- 深入理解C#中的异步(一)——APM模式EAP模式
深入理解C#中的异步(一)--APM模式EAP模式 目录 深入理解C#中的异步(一)--APM模式EAP模式 1 使用异步编程的原因 2 异步编程模式 2.1 APM模式 2.1.1 APM模式示例代 ...
- Task C# 多线程和异步模型 TPL模型
Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task TaskCompletionSource 更通用, ...
- Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别
Task C# 多线程和异步模型 TPL模型 Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...
- 结合异步模型,再次总结Netty多线程编码最佳实践
更多技术分享可关注我 前言 本文重点总结Netty多线程的一些编码最佳实践和注意事项,并且顺便对Netty的线程调度模型,和异步模型做了一个汇总.原文:结合异步模型,再次总结Netty多线程编码最 ...
- .NET - 基于事件的异步模型
注:这是大概四年前写的文章了.而且我离开.net领域也有四年多了.本来不想再发表,但是这实际上是Active Object模式在.net中的一种重要实现方法,因此我把它掏出来发布一下.如果该模型有新的 ...
- libgo协程库:网络性能完爆ASIO异步模型(-O3测试)
在purecpp社区的github组织中有一个协程库:https://github.com/yyzybb537/libgo 近日有用户找到我,想要了解一下libgo库在网络方面的性能,于是选取已入选标 ...
- JavaScript 学习笔记之线程异步模型
核心的javascript程序语言并没有包含任何的线程机制,客户端javascript程序也没有任何关于线程的定义,事件驱动模式下的javascript语言并不能实现同时执行,即不能同时执行两个及以上 ...
随机推荐
- NOIP模拟6
期望得分:100+100+100=300 实际得分:0+100+90=190 T1 superman 二分给每条边加多少,判断是否存在负环 #include<queue> #include ...
- HDU 6158 笛卡尔定理 几何
LINK 题意:一个大圆中内切两个圆,三个圆两两相切,再不断往上加新的相切圆,问加上的圆的面积和.具体切法看图 思路:笛卡尔定理: 若平面上四个半径为r1.r2.r3.r4的圆两两相切于不同点,则其半 ...
- LightOJ 1017 - Brush (III) 记忆化搜索+细节
http://www.lightoj.com/volume_showproblem.php?problem=1017 题意:给出刷子的宽和最多横扫次数,问被扫除最多的点是多少个. 思路:状态设计DP[ ...
- Qt undefined reference to ***
错因:某个类声明了一个函数但是没有定义就直接使用.
- What are the advantages of different classification algorithms?
What are the advantages of different classification algorithms? For instance, if we have large train ...
- FastStoneCapture(FSCapture)录屏、剪辑教程
FastStoneCapture软件编辑视频的使用方法: http://www.tudou.com/programs/view/2eD-s5HP1xw/
- jQuery的validation插件(验证表单插件)
更完整的参考:http://www.runoob.com/jquery/jquery-plugin-validate.html 验证隐藏字段的使用(验证通过后ajax提交表单):http://www. ...
- Wireshark抓包保存文件(图片,视频,音频等)
1.首先选择一个图片的分组 如图的9801 就是JPG 2.对下面的窗口里面选中JPEG File Interchange Format 右键选择 导出分组字节流 3.文件输入XXX.jpg,注意保存 ...
- 安全测试===CSRF攻击简介
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
- 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树
题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...