当前位置 > 首页 > Asp.net

[.Net线程处理系列]专题三:线程池中的I/O线程

2012-7-20 19:12:00来源:Asp.net

上一篇文章主要介绍了如何利用线程池中的工作者线程来实现多线程,使多个线程可以并发地工作,从而高效率地使用系统资源。在这篇文章中将介绍如何用线程池中的I/O线程来执行I/O操作,希望对大家有所帮助。

 

目录:

一、I/O线程实现对文件的异步

二、I/O线程实现对请求的异步

三、总结

 

一、I/O线程实现对文件的异步

 

1.1  I/O线程介绍:

对于线程所执行的任务来说,可以把线程分为两种类型:工作者线程和I/O线程。

工作者线程用来完成一些计算的任务,在任务执行的过程中,需要CPU不间断地处理,所以,在工作者线程的执行过程中,CPU和线程的资源是充分利用的。

I/O线程主要用来完成输入和输出的工作的,在这种情况下, 计算机需要I/O设备完成输入和输出的任务,在处理过程中,CPU是不需要参与处理过程的,此时正在运行的线程将处于等待状态,只有等任务完成后才会有事可做, 这样就造成线程资源浪费的问题。为了解决这样的问题,可以通过线程池来解决这样的问题,让线程池来管理线程,前面已经介绍过线程池了, 在这里就不讲了。

对于I/O线程,我们可以将输入输出操作分成三个步骤:启动、实际输入输出、处理结果。用于实际输入输出可由硬件完成,并不需要CPU的参与,而启动和处理结果也可以不在同一个线程上,这样就可以充分利用线程资源。在.Net中通过以Begin开头的方法来完成启动,以End开头的方法来处理结果,这两个方法可以运行在不同的线程,这样我们就实现了异步编程了。

1.2 .Net中如何使用异步

 

注意:

 其实当我们调用Begin开头的方法就是将一个I/O线程排入到线程池中(调用Begin开头的方法就把I/O线程加入到线程池中管理都是.Net机制帮我们实现的)。

(因为有些人会问什么地方用到了线程池了,工作者线程由线程池管理很好看出来,因为创建工作者线程直接调用ThreadPool.QueueUserWorkItem方法来把工作者线程排入到线程池中)。

 

在.net Framework中的FCL中有许多类型能够对异步操作提供支持,其中在FileStream类中就提供了对文件的异步操作的方法。

FileStream类要调用I/O线程要实现异步操作,首先要建立一个FileStream对象。

通过下面的构造函数来初始化FileStream对象实现异步操作(异步读取和异步写入):

public FileStream (string path, FileMode mode, FileAccess access, FileShare share,int bufferSize,bool useAsync)

其中path代表文件的相对路径或绝对路径,mode代表如何打开或创建文件,access代表访问文件的方式,share代表文件如何由进程共享,buffersize代表缓冲区的大小,useAsync代表使用异步I/O还是同步I/O,设置为true时,说明使用异步I/O.

下面通过代码来学习下异步写入文件:

 

using System;using System.IO;using System.Text;using System.Threading;namespace AsyncFile{    class Program    {        static void Main(string[] args)        {            const int maxsize = 100000;            ThreadPool.SetMaxThreads(1000,1000);            PrintMessage("Main Thread start");            // 初始化FileStream对象            FileStream filestream = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 100, true);                        //打印文件流打开的方式            Console.WriteLine("filestream is {0} opened Asynchronously", filestream.IsAsync ? "" : "not");            byte[] writebytes =new byte[maxsize];            string writemessage = "An operation Use asynchronous method to write message.......................";            writebytes = Encoding.Unicode.GetBytes(writemessage);            Console.WriteLine("message size is: {0} byte\n", writebytes.Length);            // 调用异步写入方法比信息写入到文件中            filestream.BeginWrite(writebytes, 0, writebytes.Length, new AsyncCallback(EndWriteCallback), filestream);            filestre

  • 对Action方法的参数进行双向转化

    2009-10-23 10:03:00

    摘要: 昨天有朋友忽然告诉我,在G点中国上搜索URL Routing时,我的《请别埋没了URL Routing》一文排在首位。这不禁让我汗颜,这是因为从现在的角度看起来,这篇文章的内容虽不能算错,但

  • T4MVC 2.6: MVC 2 Areas support

    2009-11-30 17:35:00

    To get the latest build of T4MVC: Go to T4MVC page on CodePlex   One of MVC 2's major new

  • MicroOrm.Net(4) Table.Query() - Where

    2012-4-8 18:33:00

    MicroOrm.Net主页: http://code.google.com/p/micro-orm-net/ MicroOrm.Net系列随便目录总览: http://www.c

  • [翻译]开发自己的web站点管理工具(Website Administration Tool)(2)

    2007-6-17 20:43:00

    摘要: 本文是该系列文章的第二部分,也是最后一部分,在这里我会详细讲解上一篇文章中没有说明的一些要点: 角色管理和访问规则管理。 你可以在本文的结尾处下载我写的WSAT程序的全部代码。 阅读全文

  • .Net动态代理Castle系列(二)--- ORM中延迟加载及实现

    2012-8-31 16:55:00

    说到延迟加载(Lazy Load), 有些文章或书籍翻译为懒加载,虽然我不太喜欢这个翻译,但是这个“懒”字能贴近生活的。很多事情我们懒得去做,如果事情没有发生,我们就赚到了。

  • 一个来自“微软”的诡异面试电话(有图有真相,可能是真的MS)

    2009-6-15 21:17:00

    本人保证:事情100%是真的,没有任何虚假成分。 上周六下午,5点多,突然接到一个面试电话,下面是对话内容: 面试电话:“您好,是X(本人的名字)吗?” 本

  • 使用Devexpress組件打印时标题的处理

    2007-3-24 12:57:00

    摘要: 如何在处理DevExpress的所有可打印部件如(gridControl,TreeList...)这些控件在打印时能加上标题。 阅读全文 fosoyo 2007-03-24 11

  • 推荐一个强类型的资源文件编辑器

    2007-1-22 11:48:00

    利用本工具,可以轻松查看,编辑资源文件,支持所有的可序列化的类型作为资源,第二个propertyGrid针对资源值是对象的资源进行深层次的编辑.如果想将自己的类作为资源嵌入,只需要将

  • BREW的第二个程序--菜单显示练习

    2010-1-9 20:32:00

    阅读: 134 评论: 0 作者: wchhuangya 发表于 2010-01-09 19:20 原文链接   这一周可真背,先是硬盘坏了,接着主板都坏了!害得我花了一周的时间才把机器搞

  • Windows SharePoint Service 工作流介绍

    2007-4-2 14:35:00

    在 WSS 3 中,我们可以使用工作流将业务流程附加到一条记录( Item ),附加后的业务流程能完全控制这条记录,包括控制记录的生命周期。例如我们能创建一个简单的工作流,将一个文档发送给一