一、在没有线程池的前提下使用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)的注意事项的更多相关文章

  1. 转:[你必须知道的异步编程]——异步编程模型(APM)

    本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中介绍了从C#1.0——C#4.0中一些 ...

  2. [你必须知道的异步编程]——异步编程模型(APM)

    本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中 介绍了从C#1.0——C#4.0中一 ...

  3. 一、异步编程模型(APM)

    一.概念 APM即异步编程模式的简写(Asynchronous Programming Model).大家在写代码的时候或者查看.NET 的类库的时候肯定会经常看到和使用以BeginXXX和EndXX ...

  4. 深入理解C#中的异步(一)——APM模式EAP模式

    深入理解C#中的异步(一)--APM模式EAP模式 目录 深入理解C#中的异步(一)--APM模式EAP模式 1 使用异步编程的原因 2 异步编程模式 2.1 APM模式 2.1.1 APM模式示例代 ...

  5. Task C# 多线程和异步模型 TPL模型

    Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task TaskCompletionSource 更通用, ...

  6. 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 ...

  7. ​结合异步模型,再次总结Netty多线程编码最佳实践

    更多技术分享可关注我 前言 本文重点总结Netty多线程的一些编码最佳实践和注意事项,并且顺便对Netty的线程调度模型,和异步模型做了一个汇总.原文:​​结合异步模型,再次总结Netty多线程编码最 ...

  8. .NET - 基于事件的异步模型

    注:这是大概四年前写的文章了.而且我离开.net领域也有四年多了.本来不想再发表,但是这实际上是Active Object模式在.net中的一种重要实现方法,因此我把它掏出来发布一下.如果该模型有新的 ...

  9. libgo协程库:网络性能完爆ASIO异步模型(-O3测试)

    在purecpp社区的github组织中有一个协程库:https://github.com/yyzybb537/libgo 近日有用户找到我,想要了解一下libgo库在网络方面的性能,于是选取已入选标 ...

  10. JavaScript 学习笔记之线程异步模型

    核心的javascript程序语言并没有包含任何的线程机制,客户端javascript程序也没有任何关于线程的定义,事件驱动模式下的javascript语言并不能实现同时执行,即不能同时执行两个及以上 ...

随机推荐

  1. Qt ------ Thread Affinity (QObject::moveToThread: Cannot move objects with a parent)

    简单的说,每个QObject的对象,都和某个创建对象所在的线程关联,如果把对象通过 moveToThread 移动到其他线程,这个对象不能有父对象,否则会出现 QObject::moveToThrea ...

  2. HDU 2827 高斯消元

    模板的高斯消元.... /** @Date : 2017-09-26 18:05:03 * @FileName: HDU 2827 高斯消元.cpp * @Platform: Windows * @A ...

  3. Python学习笔记(八)sorted

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431823058 ...

  4. Anniversary party(树形dp入门)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. JobEngine 基于quartz.net 跨平台作业框架

    github:https://github.com/zzhi/JobEngine 基于quartz.net 的跨平台作业框架 quartz.net(https://github.com/quartzn ...

  6. JavaScript:自动生成博文目录导航

    感谢 孤傲苍狼 分享了 自动生成博文目录的方法,本文仅作存档使用. 图 1:效果预览 CSS 样式 #TOCbar{ font-size:12px; text-align:left; position ...

  7. Fiddler 抓包工具总结(转)

    阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Statistics 请求的性能数据分析 3). Inspectors 查看数据内容 4). AutoResponder 允许拦截制 ...

  8. 使用迭代法穷举1到N位最大的数

    这是何海涛老师剑指offer上面第12题,这题首先注意不能使用整数int型作为操作对象,因为N很大时明显会溢出.这种大数据一般都是使用的字符串来表示. 直接法就是:1.针对字符串的加法,涉及循环进位及 ...

  9. Linux内核线程kernel thread详解--Linux进程的管理与调度(十)【转】

    转自:http://blog.csdn.net/gatieme/article/details/51589205 日期 内核版本 架构 作者 GitHub CSDN 2016-06-02 Linux- ...

  10. java处理金证中登查询图片二进制流问题

    package com.szkingdom.kess.model; import java.io.File; import java.io.FileOutputStream; import java. ...