Clr Via C#读书笔记---I/O限制的异步操作
widows如何执行I/O操作
构造调用一个FileStream对象打开一个磁盘文件-----FileStream.Read方法从文件中读取数据(此时线程从托管代码转为本地/用户模式代码)----Read在内部调用win32ReadFile函数-----ReadFile分配一个小的数据结构(I/O请求包,简称IRP)----IRP请求结构初始化(包括:一个文件句柄,文件一个偏移量,一个byte[]数组地址,要传输的字节数,以及其他常规性内容)------初始化后ReadFile将线程从本地/用户模式代码转变为本地/内核模式代码,向内核传递IRP数据结构,调用windows内核-----windows内核根据IRP设备句柄windows内核知道I/O操作需要传送给哪些硬件设备------windows将IRP送给对应的设备驱动程序的IRP队列(每个驱动维护这自己的IRP队列)-------IRP到达的时候设备驱动程序将IRP信息传递给物理硬件设备上的电路板--完成
如果工作项被送入线程池的速度比一个线程处理它们的速度快,那么线程池可以创建额外的线程。例如,四核处理器,四个客户端请求可以同时在4个线程上同时运行。而且没有上下文切换。
线程池通过判断CPU是否饱和,来决定是否创建新的线程。
“I/O完成端口”(I/OCompletion Port):CLR在初始化的时候创建一个I/O完成端口,当打开硬件设备的时候,设备科绑定到I/O完成端口。驱动程序便知道将完成IRP送到哪个队列中。
CLR没开始一次垃圾回收,CLR必须挂起进程中所有的线程。以保证垃圾回收速度变快。CLR必须遍历所有线程的栈来查找根(Root).
调试应用程序,遇到断点也会挂起调试程序中所有的线程。
CLR的异步编程模块(APM Asychronous Programming Model)
异步方式执行I/O操作,可以执行BeginXXX方法。所有的BeginXxx方法都返回一个实现了System.IAsyncResult接口的对象。调用BeginXxx方法时,会构造一个对象惟一来表示I/O请求,并将请求加入Windwos设备驱动程序的队列,然后返回对IAsyncResult对象的一个引用。
异步操作方式以EndXxx调用开始。在EndXxx和BeginXxx方法之间,只执行计算限制工作。I/O操作这些方法的“边界”处执行,所以线程永远不会阻塞。在每个方法之后,线程回到线程池中。等待处理网络响应。
AsyncEnumerator类
APM编程模型缺陷:1.代码分解多个回调方法 2.不能使用实参和局部变量 3.不能再另一个地方结束构造 4.很难实现其他功能
AsynEnumerator利用了C#迭代器语言功能解决上面问题。
应用程序及其线程处理模型
.netFramework支持不同的应程序模型。每个应用程序模型都可能引入自己的线程处理模型。
控制台应用程序和Windows服务没有引入任何种类线程处理模型。
GUI应用程序(windows窗体,wpf silverlight)引入一个线程处理模型。创建窗口线程是唯一能对那个窗口进行更新的线程。GUI线程是需要异步操作(鼠标,按键等)当异步完成时用一个线程池线程完成,而线程池线程不能负责显示更新过的UI。
SynchronizationContext类
SynchronizationContex派生对象负责将一个应用程序模型连接到他的线程处理模型。windows窗体应用程序,wpf和silverlight程序的GUI线程有一个和他关联SynchronizationContext派生对象。为了获取该对象的引用,可以让GUI查询SynchronizationContext的current属性,然后该对象引用保存到一个共享变量中。当一个线程池线程需要让GUI线程更新UI时,可以让引用保存的SynchronizationContext派生对象通过post方法传递GUI线程调用的方法。
APM注意事项
在 没有线程池的前提下使用APM
总是调用EndXxx方法而且只调用一次
调用EndXxx方法时总是用相同的对象
为BeginXxx和EndXxx方法使用ref,out,params实参
不能取消异步I/O限制操作
内存消耗
有的I/0操作必须同步完成
FileSteram特有的问题
I/O请求优先级
暂时的版本只能通过P/Invoke本地win32函数方式制定I/O优先级
将IAsyncResultAPM转换为Task
基于事件的异步模式(EAP)
EAP(Event-based Asynchronous Pattern)有点在于捅VS UI 设计器进行了很好的集成(winform的双击关联事件)。
将EAP转换为Task
APM和EAP对比
编程模型的沼泽
Clr Via C#读书笔记---I/O限制的异步操作的更多相关文章
- CLR via C# 读书笔记-27.计算限制的异步操作(上篇)
前言 学习这件事情是一个习惯,不能停...另外这篇已经看过两个月过去,但觉得有些事情不总结跟没做没啥区别,遂记下此文 1.CLR线程池基础 2.ThreadPool的简单使用练习 3.执行上下文 4. ...
- CLR Via CSharp读书笔记(26) - 计算限制的异步操作
执行上下文: 执行上下文包括安全设置(压缩栈.Thread的Principal属性和Windows身份),宿主设置(System.Threading.HostExecutionContextManag ...
- 《CLR via C#》读书笔记 之 计算限制的异步操作
<CLR via C#>读书笔记 之 计算限制的异步操作 2014-07-06 26.1 CLR线程池基础 返回 如25章所述,创建和销毁线程是一个比较昂贵的操作: 太多的线程也会浪费内存 ...
- CLR via C# 读书笔记---常量、字段、方法和参数
常量 常量是值从不变化的符号.定义常量符号时,它的值必须能在编译时确定.确定后,编译器将唱两只保存在程序集元数据中.使用const关键字声明常量.由于常量值从不变化,所以常量总是被视为类型定义的一部分 ...
- Clr Via C#读书笔记---计算限制的异步操作
线程池基础 1,线程的创建和销毁是一个昂贵的操作,线程调度以及上下文切换耗费时间和内存资源. 2,线程池是一个线程集合,供应你的用程序使用. 3,每个CLR有一个自己的线程池,线程池由CLR控制的所有 ...
- Clr Via C#读书笔记---CLR寄宿和应用程序域
#1 CLR寄宿: 开发CLR时,Microsoft实际是将他实现成包含在一个dll中的COM服务器.Microsoft为CLR定义了一个标准的COM接口,并为该接口和COM服务器分配了GUID.安装 ...
- Clr Via C#读书笔记---程序集的加载和反射
#1 加载程序集 Assembly.Load: public class Assembly { public static Assembly Load(AssemblyName assemblyRef ...
- Clr Via C#读书笔记---垃圾回收机制
#1 垃圾回收平台的基本工作原理: 访问一个资源所需的具体步骤: 1)调用IL指令newobj,为代表资源的类型分配内存.在C#中使用new操作符,编译器就会自动生成该指令.2)初始化内存,设置资源的 ...
- Clr Via C#读书笔记---线程基础
趣闻:我是一个线程:http://kb.cnblogs.com/page/542462/ 进程与线程 进程:应用程序的一个实例使用的资源的集合.每个进程都被赋予了一个虚拟地址空间. 线程:对CPU进行 ...
随机推荐
- PHP中九大缓存技术总结
PHP缓存包括PHP编译缓存和PHP数据缓存两种.PHP是一种解释型语言,属于边编译边运行的那种.这种运行模式的优点是程序修改很方便,但是运行效率却很低下.PHP编译缓存针对这种情况做改进处理,使得P ...
- 10 DelayQueue 延时队列类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 www.cnblogs.com/oloroso/ 本文由乌合 ...
- java的ArrayList使用方法
在第N个数据后面添加一个数据 用法: 在第1个元素后面添加E list.add(1, "E");
- SQL Sever2008r2 数据库服务各种无法启动的解决办法
一.Sql Server服务远程过程调用失败解决 以前出现过这个问题,那时候是因为把实例安装在了D盘,后来D盘被格式化了.然后,这些就没了.今天早上打开电脑,竟然又出现这个问题,可是Server200 ...
- C#时间转整型(时间戳),模仿php strtotime函数的部分功能
今天需要将一个基于MS SQL数据库的新闻系统数据导入phpcms v9,源系统新闻日期格式为"2014-01-15 10:45:49",而phpcms中使用的是整型时间戳,在ph ...
- 怎么安装MYSQL5.0的JDBC驱动
1.下载mysql for jdbc driver. http://dev.mysql.com/downloads/connector/j/3.1.htmlMySQL Connector/J is ...
- php 通过API接口连接12306余票查询
<?php header("content-type:text/html;charset='utf-8'"); //设置编码 echo "<meta cont ...
- android studio插件提升工作效率
SonarLint 代码质量管理插件 ButterKnife Zelezny ButterKnife 生成器,快速根据布局文件生成属性对象. SelectorChapek 设计师给我们提供好了各种资源 ...
- 针对跑MySQL的Linux优化【转】
本文来自:http://www.mysqlsupport.cn/linux-performance-tuning-tips-mysql/ 因为很多MySQL的生产环境都在Linux下,我决定指出一些L ...
- ABAP 内表的行列转换-发货通知单-打印到Excel里-NEW-(以运单号为单位显示ALV然后保存输出)
*********************************************************************** * Title : ZSDF003 ...