C\#스 레 드 처리 시리즈 스 레 드 탱크 의 I/O 스 레 드

1.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 스 레 드 를 스 레 드 탱크 에 배열 하 는 것 이다.
(어떤 사람들 은 스 레 드 풀 을 어디 에 사 용 했 는 지 물 어 볼 수 있 기 때문에 작업 자 스 레 드 는 스 레 드 풀 에서 관리 하 는 것 이 보기 좋 습 니 다.작업 자 스 레 드 를 만 들 때 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
", 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}
CurrentThreadId is {1}
CurrentThread is background :{2}
WorkerThreadNumber is:{3}
IOThreadNumbers is: {4}
", data, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsBackground.ToString(), workthreadnumber.ToString(), iothreadnumber.ToString()); } } }
실행 결과:

실행 결 과 를 통 해 알 수 있 듯 이 이 때 는 스 레 드 탱크 의 I/O 스 레 드 를 호출 하여 리 셋 함 수 를 실행 하 는 동시에 프로젝트 의 빈\Debug 파일 디 렉 터 리 에 text.txt 파일 을 생 성 합 니 다.파일 을 열 면 그 내용 이 바로 당신 이 쓴 것 임 을 알 수 있 습 니 다.
방금 파일 에서 우리 가 쓴 내용 을 비동기 로 읽 는 방법 을 보 여 줍 니 다.

using System;
using System.IO;
using System.Text;
using System.Threading;

namespace AsyncFileRead
{
  class Program
  {
    const int maxsize = 1024;
    static byte[] readbytes = new byte[maxsize];
    static void Main(string[] args)
    {
      ThreadPool.SetMaxThreads(1000, 1000);
      PrintMessage("Main Thread start");

      //    FileStream  
      FileStream filestream = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 100, false);

      //         
      filestream.BeginRead(readbytes, 0, readbytes.Length, new AsyncCallback(EndReadCallback), filestream);
      Console.Read();
    }

    private static void EndReadCallback(IAsyncResult asyncResult)
    {
      Thread.Sleep(1000);
      PrintMessage("Asynchronous Method start");

      //  AsyncResult.AsyncState   State  
      FileStream readstream = (FileStream)asyncResult.AsyncState;
      int readlength = readstream.EndRead(asyncResult);
      if (readlength <=0)
      {
        Console.WriteLine("Read error");
        return;
      }

      string readmessage = Encoding.Unicode.GetString(readbytes, 0, readlength);
      Console.WriteLine("Read Message is :" + readmessage);
      readstream.Close();
    }

    //        
    private static void PrintMessage(String data)
    {
      int workthreadnumber;
      int iothreadnumber;

      //            ,               workthreadnumber  
      //      I/O     iothreadnumber  
      ThreadPool.GetAvailableThreads(out workthreadnumber, out iothreadnumber);

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

여기 서 주의해 야 할 문제 가 있 습 니 다.만약 에 여러분 이 테스트 를 할 때 생 성 된 text.txt 파일 을 이 프로젝트 의 빈\debug\디 렉 터 리 에 두 어야 합 니 다.제 가 처음에 했 을 때 복사 하 는 것 을 잊 었 습 니 다.읽 은 데이터 길 이 는 0 입 니 다.
2.I/O 스 레 드 는 요청 에 대한 비동기 화 를 실현 합 니 다.
저 희 는 또한 I/O 스 레 드 를 이용 하여 브 라 우 저가 서버 에 요청 한 비동기 동작 을 모 의 할 수 있 습 니 다..net 라 이브 러 리 에 있 는 WebRequest 류 는 비동기 요청 을 지원 합 니 다.
요청 비동기 화 를 어떻게 실현 하 는 지 보 여 드 리 겠 습 니 다.

using System;
using System.Net;
using System.Threading;

namespace RequestSample
{
  class Program
  {
    static void Main(string[] args)
    {
      ThreadPool.SetMaxThreads(1000, 1000);
      PrintMessage("Main Thread start");

      //       Web  
      WebRequest webrequest =WebRequest.Create("http://www.cnblogs.com/");
      webrequest.BeginGetResponse(ProcessWebResponse, webrequest);

      Console.Read();
    }

    //     
    private static void ProcessWebResponse(IAsyncResult result)
    {
      Thread.Sleep(500);
      PrintMessage("Asynchronous Method start");

      WebRequest webrequest = (WebRequest)result.AsyncState;
      using (WebResponse webresponse = webrequest.EndGetResponse(result))
      {      
        Console.WriteLine("Content Length is : "+webresponse.ContentLength);
      }
    }

    //        
    private static void PrintMessage(String data)
    {
      int workthreadnumber;
      int iothreadnumber;

      //            ,               workthreadnumber  
      //      I/O     iothreadnumber  
      ThreadPool.GetAvailableThreads(out workthreadnumber, out iothreadnumber);

      Console.WriteLine("{0}
CurrentThreadId is {1}
CurrentThread is background :{2}
WorkerThreadNumber is:{3}
IOThreadNumbers is: {4}
", data, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsBackground.ToString(), workthreadnumber.ToString(), iothreadnumber.ToString()); } } }
실행 결 과 는:
 
여기까지 쓰 면 I/O 스 레 드 에 관 한 글 도 거의 다 쓰 지 못 했 습 니 다.사실 I/O 스 레 드 는 많은 일 을 할 수 있 습 니 다.네트워크(Socket)프로 그래 밍,웹 개발 에 있어 I/O 스 레 드 를 사용 합 니 다.다 중 스 레 드 가 실제 작업 에서 모두 응용 되 는 곳 을 보 여 주 려 고 했 습 니 다.하지만 뒤 에는 다 중 스 레 드 시리즈 가 끝 난 후에 지식 을 함께 연결 하여 데모 하 는 것 이 좋 을 것 같 습 니 다.다음 글 에 서 는 하 스 레 드 동기 화 문 제 를 소개 할 것 입 니 다.

좋은 웹페이지 즐겨찾기