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 之 文件系统 创建文件夹,重命名文件夹,删除文件夹, ...
随机推荐
- 学习java之路 简单日历查询代码
/** * 31天的 1, 3, 5, 7, 8, 10 ,12 30天的 4, 6,9,11 28天(平年) 2 29天(闰年) 2 */ class Demo{ public static voi ...
- hashtable and hashmap
hashmap的bucket 和 ‘负载因子’的介绍 https://blog.csdn.net/wenyiqingnianiii/article/details/52204136
- JS中的同步和异步
javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流水线而已,要 ...
- Oracle 中DATE类型的计算
select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_months(sysdate,1) f ...
- kvm+webvirtmgr在centos7上的部署
#!/bin/bash #+++++++++++++++++++++++++++++++++++++++++++++++++++++++安装配置kvm并创建虚拟机+++++++++++++++++++ ...
- CSS3——animation的基础(轮播图)
作为前端刚入门的小菜鸟,只想记录一下每天的小收获 对于animation动画 1.实现动画效果的组成: (1)通过类似Flash的关键帧来声明一个动画 (2)在animation属性中调用关键帧声明的 ...
- ubuntu16 gitlab的简单安装
1.安装好ubuntu的ssh服务,使用xshell登录虚拟机 2.下载安装包: wget -c https://downloads-packages.s3.amazonaws.com/ubuntu ...
- mysql--user表
mysql数据库 用例:mysql mysql> show tables; +---------------------------+ | Tables_in_mysql | +------- ...
- SSH连接Linux操作:
Centos6.5的操作: 1:需要下载一个Xshell连接工具: 2:在Linux输入ifconfig,查看IP地址, 3:使用Xshell连接 Ubuntu的操作: 1:需要下载一个Xshell连 ...
- The test form is only available for requests from the local machine
使用浏览器测试Web服务时出现提示“The test form is only available for requests from the local machine.”的解决办法 在Web服务项 ...