当前位置 > 首页 > 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

  • LINQ 和泛型

    2009-5-17 21:00:00

    在.net2.0中引用了泛型,泛型是我在.net 2.0众多特性中最喜欢的一个,可以说泛型给我们的编程思想上带来了不小的影响。.net2.0和.net1.1相比,很多功能用泛型和不用泛型都可以实现,

  • Serialize and Deserialize JSON

    2009-11-7 2:47:00

    On one of the projects I am working on I needed a way to work get the JSON string generated from

  • UML建模之数据建模(Data Model Diagram)

    2009-12-26 2:23:00

    阅读: 13 评论: 0 作者: 灵动生活 发表于 2009-12-26 01:12 原文链接 一、数据库模简介 二、数据建模元素 .

  • NHibernate LINQ 1.0 Released

    2009-7-27 6:07:00

    After the recent release of NHibernate 2.1.0 (a nice one!), the next best news is the release of

  • An introduction to ASP.Net MVC 4.0

    2012-4-30 4:33:00

    I have been looking into ASP.Net MVC 4.0 lately and I thought it would be a nice idea to create a s

  • 一个泛型的小例子 Linq查询解决Combox绑定问题

    2010-1-12 19:03:00

    阅读: 41 评论: 0 作者: 苏飞 发表于 2010-01-12 18:15 原文链接 自己写的皮肤为了好看只取了Text没有Value,现在用这个方法解决一下只有Text取Value

  • ASP.NET MVC Code and Slides for Best of Mix 09 Presentation

    2009-5-18 17:31:00

    The code and slides from my ASP.NET MVC vs. Web Forms talk at the Best of Mix 09 – Phoenix event ca

  • 趣味编程:从字符串中提取信息

    2009-10-12 17:58:00

    摘要: 字符串解析是程序员工作中非常重要的一部分,也是非常考验编程能力的工作。基本上我在面试程序员的时候,一定会出一道编程题目作为考察的一方面,而这道题目有很大的可能性是做字符串的解析。例如,给出一

  • What do you think of my ASP.NET MVC gallery layouts?

    2009-7-21 7:14:00

    To try out Visual Studio 2010 and .Net Framework 4.0 I decided to write simple gallery applicatio

  • 手把手教你写Ajax驱动的DataGrid控件(三)

    2007-10-10 9:24:00

    摘要: 数据源要在适当的时间销毁,如果太早,当然不行;如果太晚,势必造成内存的浪费。我们提供两种机制确保不再使用的数据源可以被销毁。 阅读全文 wfyfngu 2007-10-10 09