C# Windows异步I/O操作
1、简介
关于Windows的异步I/O操作,只要解决的是同步I/O操作的线程利用率问题,通过异步I/O Api来提升线程的利用率,提升系统的吞吐能力,将各种I/O操作交给线程池然后交由硬件设备执行,期间完全不占用线程和CPU资源.
2、同步I/O存在的问题
当编写同步I/O操作时,在硬件设备执行I/O操作的期间,当前线程会等待硬件设备完成执行,所以这个时候主线程处于休眠状态(Windows控制),为了防止主线程浪费CPU时间,但是虽然不浪费时间,它还是会浪费内存!
static string _filePath = @"C:\Users\zhengchao\Desktop\测试文件.txt";
static void Main(string[] args)
{
//打开目标文件,并进行只读操作(FileAccess.Read文件的操作权限)
using (var stream = new FileStream(_filePath,FileMode.Open,FileAccess.Read))
{
//打开磁盘文件后,先申明一个和流大小一样的字节数组
var contentBytes = new byte[stream.Length]; //调用Read方法,当前主线程的托管代码转换为用户模式代码,接着Read会调用Win32 ReadFile函数
//ReadFile分配一个小的数据结构,即I/O请求包(I/O Request Packet,IRP),IRP结构包含如下内容
//文件句柄(关于文件句柄,可以在FileStream种给定IntPtr对象实例)
//文件的偏移量(即你想从那个位置开始读取文件,可在Read方法种给定offset参数)
//一个Byte数组的地址,即给定Read方法成功读取内容后,需要将内容填充至哪里 //此时当前主线的托管代码已经转换为用户模式代码,开启向内核传递IRP数据,根据IRP种的设备句柄,Windows
//知道要将I/O请求传递给哪个硬件设备,因此,Windows知道将IRP传送给对应的设备驱动程序的IRP队列,每个
//设备驱动程序都维护者自己的IRP队列,其中运行者设备上所有进程发出的I/O请求,接着设备驱动程序会将IRP信息
//发送给物理设备上安装的电路板,开始执行对应的I/O操作 //但是,在电路板执行I/O操作的期间,当前线程会等待电路板完成执行,所以这个时候主线程处于休眠状态(Windows控制)
//为了防止主线程浪费CPU时间,但是虽然不浪费时间,它还是会浪费内存! //最后,硬件设备完成I/O操作,Windows会唤起主线程,这个时候内核代码会转变成为托管代码,最后Read方法会拿到
//一个int32值,该值说明从文件种读取的实际字节数,使你知道在传给Read的byte[]参数时,实际能传递什么值
var readResult=stream.Read(contentBytes, ,contentBytes.Length);
Console.WriteLine(contentBytes.ConvertToString());
} Console.ReadKey();
} }
public static class ByteExtension
{
public static string ConvertToString(this byte[] bytes)
{
return Encoding.Default.GetString(bytes);
}
}
关于Windows如何执行同步I/O操作的过程,代码种都由说明,但是明显同步的方式,CPU利用率很低.
C# Windows异步I/O操作的更多相关文章
- 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期
[源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- 【原创-算法-实现】异步HTTP请求操作
一.说明 1) 这个类 是我 在真实项目中,优化解决真实问题 时,不参考第三方代码,完全由自己查阅MSDN官方文档 , 完成的一个真实生产环境中使用的功能类 2) 读者在使用此类时,请尊重原创,在代码 ...
- 异步I/O操作
今天在看boost库的时候注意到异步I/O操作时,缓冲区有效性问题. 如何实现异步操作:以异步读操作为例async_read(buffer, handler): void handler() {} v ...
- Task:取消异步计算限制操作 & 捕获任务中的异常
Why:ThreadPool没有内建机制标记当前线程在什么时候完成,也没有机制在操作完成时获得返回值,因而推出了Task,更精确的管理异步线程. How:通过构造方法的参数TaskCreationOp ...
- windows 2008R2 无法安装操作系统补丁,或无法安装Sp1升级包的解决办法
windows 2008R2 无法安装操作系统补丁,或无法安装Sp1升级包的解决办法 给 C:\ 加上users读取和执行,,列出文件夹内容,及读取的权限,不需要就用到子目录 将 C:\Windows ...
- IOS异步和多线程操作&&在sqlite3中的应用
1,数据库I/O操作(异步) 数据库本身是存储在磁盘上.访问和修改数据库,即对磁盘进行读写,即I/O操作. 磁盘属于计算机硬件,具有DMA能力,不需要CPU干预,可以实现异步操作. I/O操作一般是消 ...
- asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案
之前碰到asp.net core异步进行新增操作并且需要判断某些字段是否重复的问题,进行插入操作的话会导致数据库中插入重复的字段!下面把我的解决方法记录一下,如果对您有所帮助,欢迎拍砖! 场景:EFC ...
- 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件
[源码下载] 背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 创建文件夹,重命名文件夹,删除文件夹, ...
随机推荐
- int main(int argc, char** argv) 以及CommandLineParser
参考链接: 关于int main(int argc, char** argv) http://blog.csdn.net/liuhuiyi/article/details/8239303 http:/ ...
- Mysql双主互备+keeplived高可用架构(部分)
一.Mysql双主互备+keeplived高可用架构介绍 Mysql主从复制架构可以在很大程度保证Mysql的高可用,在一主多从的架构中还可以利用读写分离将读操作分配到从库中,减轻主库压力.但是在这种 ...
- Python Day 12
阅读目录: 内容回顾 函数默认值的细节 三元表达式 列表与字典推导式 函数对象 名称空间 函数嵌套的定义 作用域 ##内容回顾 # 字符串的比较 -- 按照从左往右比较每一个字符,通过字符对应的asc ...
- XMLHttpRequest状态码及相关事件
1.创建一个XMLHttpRequest对象 2.对XMLHttpRequest对象进行事件的监听(定义监听事件的位置不影响 3.对XMLHttpRequest对象的状态码 状态 名称 描述 0 ...
- appium 1.6.x版本去除安装Unlock、Setting
(appium目录不知道可以查看appium运行日志) 修改目录/usr/local/lib/node_modules/appium/node_modules/appium-android-drive ...
- 学以致用三十六-----弄懂python装饰器
看了海峰老师讲解的装饰器视频,讲解的非常棒.根据视频,记录笔记如下: 装饰器: 1.本质是函数,用def来定义.功能就是用来(装饰)其他函数,为其他函数添加附加功能 现有两个函数如下, def tes ...
- post文件下载
this.$http({ method: 'post', url: '/file/download', responseType: 'blob', data: JSON.stringify(this. ...
- spring InitializingBean和DisposableBean init-method 和destroy-method @PostConstruct @PreDestroy
对于初始化函数: @PostConstruct 注解的方法 InitializingBean接口定义的回调afterPropertiesSet() Bean配置中自定义的初始化函数 对于析构则与上相同 ...
- 关于Apahce服务器安装中遇到的问题
在这篇中,将记录一下安装Apache服务器所遇到的一些问题,并简单讲一些Apache和Tomcat的区别: 1>apache安装中遇到的问题: 1.1 Apache目前不再提供编译好的exe安装 ...
- VC6 LINK : fatal error LNK1168: cannot open Debug/Test.exe for writing
在使用VC++运行程序时,第一次没有任何问题,但是当再次运行时就会出现:LINK : fatal error LNK1168: cannot open Debug/Test.exe for writi ...