C\#스 레 드 처리 시리즈 스 레 드 탱크 의 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 스 레 드 를 사용 합 니 다.다 중 스 레 드 가 실제 작업 에서 모두 응용 되 는 곳 을 보 여 주 려 고 했 습 니 다.하지만 뒤 에는 다 중 스 레 드 시리즈 가 끝 난 후에 지식 을 함께 연결 하여 데모 하 는 것 이 좋 을 것 같 습 니 다.다음 글 에 서 는 하 스 레 드 동기 화 문 제 를 소개 할 것 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.