선생님 안녕하세요.
https://www.sysnet.pe.kr/3/0/5314 에 글을 읽고 좀 더 명확하게 정리했봤는데
혹시 제가 잘못 해석한 부분이 있을까요?
private static async void ProcessTcpClient(TcpClient client){
NetworkStream ns = client.GetStream();
byte[] buffer = new byte[1024];
// await 키워드를 만나면 Main 스레드는 ProcessTcpClient 메서드를 벗어난다.
// 스레드 풀에서 가져온 A 스레드를 이용해서 작업
// IRP(I/O 요청 패킷)을 디바이스 드라이버의 IRP 큐에 IRP를 큐잉작업까지만 스레드 A는 수행하고
// 스레드 A는 스레드 풀에서 회수한다.
int received = await ns.ReadAsync(buffer, 0, buffer.Length);
// 만약 Read 작업 결과이 완료되었다면 스레드 풀에서 스레드를 꺼내서 아래 두 줄을 실행하는데
// 이때 우연히 스레드 A를 꺼낼 수 있거나 혹은 새로운 스레드 B를 꺼낼 수 있다.
// 하지만 여기서는 스레드 B를 통해서 아래 2줄을 수행한다고 가정한다.
string txt = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
byte[] sendBuffer = Encosing.UTF8.GetBytes("Hello :" + txt);
// await 키워드를 만났기 때문에 이전에 수행된 스레드 B가 스레드 풀에서 회수되고
// 스레드 풀에서 꺼낸 새로운 스레드 C를 통해 작업을 수행한다.
// 마찬가지로 디바이스 드라이버의 IRP 큐에 IRP를 큐잉작업까지만 스레드 C는 수행하고
// 스레드 풀에서 스레드 C를 회수한다.
await ns.WriteAsync(sendBuffer, 0, sendBuffer.Length);
// 스레드 Write 작업이 완료되었다면 스레드 풀에서 스레드를 꺼내서 아래 한 줄을 수행하는데
// 이때 우연히 스레드 A 혹은 스레드 B를 꺼낼 수 있지만
// 여기서는 스레드 D를 통해서 아래 한 줄을 수행한다고 가정한다.
ns.Close();
}
[최초 등록일: ]
[최종 수정일: 5/9/2022]