C#线程处理系列之线程池中的I/O线程

2019-12-30 12:04:03于海丽

其中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} byten", writebytes.Length);
      // 调用异步写入方法比信息写入到文件中
      filestream.BeginWrite(writebytes, 0, writebytes.Length, new AsyncCallback(EndWriteCallback), filestream);
      filestream.Flush();
      Console.Read();

    }

    // 当把数据写入文件完成后调用此方法来结束异步写操作
    private static void EndWriteCallback(IAsyncResult asyncResult)
    {
      Thread.Sleep(500);
      PrintMessage("Asynchronous Method start");

      FileStream filestream = asyncResult.AsyncState as FileStream;

      // 结束异步写入数据
      filestream.EndWrite(asyncResult);
      filestream.Close();
    }

    // 打印线程池信息
    private static void PrintMessage(String data)
    {
      int workthreadnumber;
      int iothreadnumber;

      // 获得线程池中可用的线程,把获得的可用工作者线程数量赋给workthreadnumber变量
      // 获得的可用I/O线程数量给iothreadnumber变量
      ThreadPool.GetAvailableThreads(out workthreadnumber, out iothreadnumber);

      Console.WriteLine("{0}n CurrentThreadId is {1}n CurrentThread is background :{2}n WorkerThreadNumber is:{3}n IOThreadNumbers is: {4}n",
        data,
        Thread.CurrentThread.ManagedThreadId,
        Thread.CurrentThread.IsBackground.ToString(),
        workthreadnumber.ToString(),
        iothreadnumber.ToString());
    }
  }
}

运行结果:

C#,线程处理,线程池,I/O线程