`
housaregod6982
  • 浏览: 11805 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

.NET中的异步编程(四)- IO完成端口以及FileStream.BeginRead

 
阅读更多

来源:http://www.verydemo.com/demo_c134_i36767.html

写这个系列原本的想法是讨论一下.NET中异步编程风格的变化,特别是F#中的异步工作流以及未来的.NET 5.0中的基于任务的异步编程模型。但经过三篇文章后很多人对IO异步背后实现的原理以及为什么这样能提高性能很感兴趣。其实我本不想花更多的文字在这些底层实现的细节上,一来我并不擅长这些方面,二来我们使用.NET的异步IO就不需要关心这些底层东西,因为已经为你封装完备了。不过为了避免大家一再在这上面商讨,我还是在这个系列中间插入了一篇来解释一下。

本文我将从内核对象IO完成端口开始介绍,然后来瞧瞧.NET BCL中的FileStream.BeginRead是如何利用IO完成端口来实现的。

IO完成端口(IO Completion Port)

大多数人应该或多或少地听说过IO完成端口这么个东西,而且也知道它是实现高性能IO,高伸缩性应用的尚方宝剑。IO完成端口是一个非常复杂的内核对象,其实现的也非常巧妙,细细琢磨还是非常有意思的。

创建高伸缩性的应用的一个基本原则就是:创建更少的线程。线程数更少首先消耗的资源就少,每个线程的创建除了要浪费CPU时间外,还要创建一系列的数据结构用来保存线程相关的一些信息:用户栈,线程上下文,内核栈等。这个总共加起来大概1.5M左右,那么你算算你的32位机器总共能使用多少内存?那么对应地能创建多少线程?可能有人讲那对于64位的就无所谓了。嗯,在资源占用这方面64位确实不用担心。但是系统中可运行的线程数越多,你的CPU数又是有限的(8个?80个?)。Windows的任务调度机制是每个线程会运行一个时间片,然后Windows抢占式的调度另一个线程运行。那么线程数越多,Windows势必要进行更频繁的线程上下文切换。线程上下文切换对系统性能的影响在这里我就不多说了,你可以搜搜资料。

那么如何做到创建更少的线程,而又干更多的事儿呢?答案就是“不等待”。相对CPU来说,IO设备的速度简直低的要命。就好像飞机和拖拉机的差别一样,我们可不能让拖拉机拖了飞机的后退儿。而IO完成端口就是为了这个而生的:创建更少的线程,干更多的事儿。

IO完成端口首先不是一个我们看得见摸得着的什么插口,也和我们常说的80这样的端口不同。你可以将其理解为一个数据结构或一个对象(下面我会用C#的代码来辅助讲解IO完成端口,仅仅是讲解,这些代码并不是真…………………………………………………………………………

分享到:
评论

相关推荐

    生成系统日志

    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor...

    FileStream.Me - 官方的Chrome扩展「FileStream.Me - official Chrome extension」-crx插件

    使用FileStream.Me服务下载链接 这个独特的应用程序通过使用FileStream.Me服务简化了您喜欢的音乐,电影和软件的下载。 我们的应用程序可帮助您发现可以使用FileStream.Me下载的链接。 只需单击一下,所选的链接就会...

    FileStream.Me - official Chrome extension-crx插件

    只需单击一下,所选的链接就会立即发送到FileStream.Me上的您的个人帐户中。 有两种方法可以开始下载所选文件:-单击应用程序图标(单击鹦鹉!),插入链接,然后单击“下载”按钮; -右键单击链接,然后从上下文...

    C#源代码-FileStream文件流的操作.zip

    C#源代码,有注释

    vb.net世界上最强的错误捕捉代码

    非常详细的捕捉到错误信息,错误位置,错误行号,还有堆栈跟踪,这是用vb.net写的,如果用c#.net可以参考进行转换,代码中包括获取当前类名和获取当前方法名等经典代码。捕捉到的错误信息如下: 错误信息:未能找到...

    ASP.NET中的FILESTREAM对象总结

    filestream对象为文件的读写操作提供通道,而file对象相当于提供一个文件句柄,在文件操作中,filestream对象的操作比较简单。    创建filestream对象    创建filestream对象可以采用file对象的create方法或open...

    QR.NET-master.zip_QRCODE_asp.net_drawing_web打印 二维码_二维码

    System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate,System.IO.FileAccess.Write); printPicture.Save(fs, System.Drawing.Imaging.ImageFormat.Png); fs.Close();...

    iTextSharp.LGPLv2.Core:iTextSharp.LGPLv2.Core是iTextSharp(V4.1.6)的最新LGPL版本到.NET Core的非官方端口

    iTextSharp.LGPLv2.Core是的最新到.NET Core的非官方端口。 通过NuGet安装 要安装iTextSharp.LGPLv2.Core,请在程序包管理器控制台中运行以下命令: PM> Install-Package iTextSharp.LGPLv2.Core 您也可以在NuGet...

    .net存取数据库二进制文件

    Dim fs = New FileStream("c:\1.jpg", IO.FileMode.Open, IO.FileAccess.Read) Dim imgData(fs.Length - 1) As Byte fs.Read(imgData, 0, fs.Length - 1) fs.close() Dim tempConnection As New ...

    sql-filestream-to-storage-migration:将SQL FileStream内容迁移到Azure存储的工具

    SQL Server FileStream到Azure存储 一个简单的.NET Core 2.1工具可帮助您将内容迁移到Azure SQL数据库和Azure Blob存储。 入门 Visual Studio 2017,.NET Core 2.1 Azure SQL数据库 Azure Blob存储帐户 在替换必要...

    .NET万能框架:Masuit.Tools

    项目基于.NET 4.5构建,语法版本C#6.0,包含日常编程多数的常用封装,可以说是一个万能框架,能够用于任何基于.NET平台的项目当中。 功能主要覆盖: 数据库操作:内存表操作、关系实体映射等; 日期时间常用操作...

    FileStream.SetAccessControl引发UnauthorizedAccessException :: File.SetAccessControl起作用

    太好了-谢谢Rick!我已经按照您的建议(如下所示)更新了我的代码,并且效果很好。 我没有尝试过此操作,因为我认为锁是文件流所拥有的,因此从其他对象访问文件会导致问题-否则很容易学习...

    asp.net中最棒的 IO体系和静态页面 案例

    这是一个学习.net的案例,其中运用到了FileDicrectory 、FileStream、网络流,文本流 等技术。可以自动读取磁盘的相关信息。多种 静态页面的生成的案例。 希望对大家有所帮助!

    C# FileStream 追加写入字符串到文本中

    C# FileStream 追加写入字符串到文本中 C# FileStream 追加写入字符串到文本中 C# FileStream 追加写入字符串到文本中 C# FileStream 追加写入字符串到文本中

    数据库系统-招标参数---模板.doc

    " " " "提供跨文件系统的数据管理,利用Filestream技术" " " "把文件管理统一到数据库管理中,避免了以前只是" " " "通过大二进制存储的方式存储,低效的访问方式。" " "数据库性能 "数据库提供数据表分区能力的...

    VB.net 获取文件的MD5值

    Imports System.IO Imports System.Security.Cryptography Public Class Form1 '获取文件MD5值的函数 Public Shared Function _MD5(ByVal strSource As String) As String Dim fstream As New FileStream...

Global site tag (gtag.js) - Google Analytics