一、在没有线程池的前提下使用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. 在web.xml中添加servlet报错问题

    出现这种问题的原因是因为servlet-name标签中没有名称,如果错误出现在servlet上,也是一样,补充servlet-name名称即可.如下图

  2. SpringCloud(四)服务发现与消费:以ribbon为例

    说明: ribbon是spring-cloud中作为服务消费者的一种角色,客户端可以通过它来对服务提供者的服务进行消费, 比如本例中是服务提供者注册到注册中心,服务提供者提供了一个服务接口,返回一个h ...

  3. python常用函数库及模块巧妙用法汇总

    在用python编写脚本或写程序过程中总要遇到一些对大文件或数据进行排序,计算,循环跌代等.我想下面这些函数库一定能用得到,总结如下:便于以后备查 列表去重(传说是列表去重最高效的方法): al = ...

  4. spring boot(一):入门

    Spring Boot的优点 Spring Boot 是伴随着 Spring 4.0 诞生的,从字面理解,Boot是引导的意思,因此 Spring Boot 旨在帮助开发者快速搭建 Spring 框架 ...

  5. 【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行

    [算法]01分数规划-最优比率环 [题意]给定有向图,点有收益,边有代价,重复经过的话收益不叠加而代价叠加,求从任意点开始最后回归该点的(收益/代价)最大. [题解] 和普通的分数规划不同,这里的方案 ...

  6. python中随机数生成

    1.random.random random.random()用于生成一个0到1的随机符小数: 0 <= n < 1.0 2.random.uniform random.uniform的函 ...

  7. Perl6多线程2: Promise new/keep/bread/status/result

    来源于个人理解的翻译. 创建一个 promise: my $p = Promise.new; 可以打印运行 的Promise 状态: my $p = Promise.new(); $p.then({s ...

  8. udhcpc命令

    要使用网络通讯,所以不可避免的要用到dhcp.理想的网络通讯方式是下面3种都要支持: 1,接入已有网络.这便要求可以作为dhcp客户端. 2,作为DHCP服务器,动态分配IP. 简单说下前2种情况. ...

  9. KVC, KVO 实现原理

    Key-Value Coding: 键值编码 (KVC) 方法调用: // 对象属性 // 类似: Person -> name setValue: forKey: // 对象的属性或者 属性的 ...

  10. css 水平、垂直居中

    水平居中 行内元素 行内元素:(img.span.文字等行内元素),通过在父级元素设置 text-align:center 使元素水平居中. 块级元素 块级元素:(div.p.h1...h6.ul.l ...