Microsoft MVP성태의 닷넷 이야기
교재 689, 690쪽(async/await) 질문입니다. [링크 복사], [링크+제목 복사],
조회: 12171
글쓴 사람
한예지 donator
홈페이지
첨부 파일
 

선생님 안녕하세요.

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]


비밀번호

댓글 작성자
 



2022-05-09 10시32분
아래와 같이 정정했으니 또 궁금하신 것이 있으면 질문해주세요.

private static async void ProcessTcpClient(TcpClient client){
    NetworkStream ns = client.GetStream();
    
    byte[] buffer = new byte[1024];
    // await 키워드를 만나면 Main 스레드는 ProcessTcpClient 메서드를 벗어난다.
       ==> 엄밀히는 그럴 수도 있고, 아닐 수도 있습니다. (await 대상이 되는 메서드가 꼭 내부적으로 비동기 작업을 한다는 보장은 없습니다. (참고: https://www.sysnet.pe.kr/2/0/11431)
       
    // 스레드 풀에서 가져온 A 스레드를 이용해서 작업
       ==> 아직 이 단계에서는 스레드 풀에서 가져온 스레드로 작업을 하지 않습니다.
       ==> ReadAsync 내부의 비동기 호출 단계까지는 "ProcessTcpClient" 메서드를 호출한 스레드가 담당합니다.

    // IRP(I/O 요청 패킷)을 디바이스 드라이버의 IRP 큐에 IRP를 큐잉 작업까지만 호출 스레드가 담당
    int received = await ns.ReadAsync(buffer, 0, buffer.Length);

    // 만약 Read 작업 결과가 완료되었다면 스레드 풀에서 스레드(예를 들어 스레드 A)를 꺼내서 아래 두 줄을 실행하는데,
    string txt = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
    byte[] sendBuffer = Encosing.UTF8.GetBytes("Hello :" + txt);
    
    // 마찬가지로 디바이스 드라이버의 IRP 큐에 IRP를 큐잉 작업까지만 스레드 A는 수행하고
    await ns.WriteAsync(sendBuffer, 0, sendBuffer.Length);
    // 스레드 Write 작업이 완료되었다면 스레드 풀에서 스레드를 꺼내서 아래 한 줄을 수행하는데
    // 이때 우연히 스레드 A를 꺼낼 수 있지만
    // 여기서는 또다른 스레드 B를 통해서 아래 한 줄을 수행한다고 가정한다.
    ns.Close();
}
정성태
2022-05-10 01시18분
[한예지] 답변 감사드립니다!

답변해 주신 내용을 바탕으로 아래와 같이 정리해도 문제 없을까요?

private static async void ProcessTcpClient(TcpClient client){
    NetworkStream ns = client.GetStream();
    
    byte[] buffer = new byte[1024];
    // Main 스레드가 IRP(I/O 요청 패킷)을 디바이스 드라이버의 IRP 큐에 IRP를 큐잉 작업까지
    // 처리하고 ProcessTcpClient 메서드를 벗어난다.
    int received = await ns.ReadAsync(buffer, 0, buffer.Length);

    // 만약 Read 작업 결과가 완료되었다면 스레드 풀에서 스레드(스레드 A라고 가정)를 꺼내서 아래 두 줄을 실행하는데,
    string txt = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
    byte[] sendBuffer = Encosing.UTF8.GetBytes("Hello :" + txt);
    
    // 마찬가지로 디바이스 드라이버의 IRP 큐에 IRP를 큐잉 작업까지만 스레드 A는 수행하고 스레드 풀에 회수된다.
    await ns.WriteAsync(sendBuffer, 0, sendBuffer.Length);
    // 스레드 Write 작업이 완료되었다면 스레드 풀에서 스레드를 꺼내서 아래 한 줄을 수행하는데
    // 이때 우연히 스레드 A를 꺼낼 수 있지만
    // 여기서는 또 다른 스레드 B를 통해서 아래 한 줄을 수행한다고 가정한다.
    ns.Close();
}
[guest]
2022-05-10 01시34분
넵, 개념적으로 그렇게 이해하시면 좋겠습니다. (그나저나... 많은 분들이 이에 대해 혼란을 느끼시는 듯하니 관련해서 글을 하나 써야겠군요. ^^;)
정성태
2022-05-10 04시03분
[한예지] 작성해 주시면 정말 감사하죠! 기대하고 있겠습니다^^

아, 혹시 후원 채널을 1개로 하신 이유가 있으신가요??

예전에 있던 BUY ME A COFFEE 버튼은 회원가입을 안 해도 되는데

paypal은 회원가입을 해야 되네요 ㅜ_ㅜ
[guest]
2022-05-10 07시06분
아쉽게도 donaricano("https://donaricano.com/") 서비스가 중단되었습니다. ^^ (게다가 국내에서는 마땅한 기부 링크가 없습니다.)
정성태

... 76  77  78  [79]  80  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
530독불장군12/20/200613045        답변글 [답변]: [답변]: 답변에 감사 드립니다.
523주낙현12/12/200612454healthMonitoring 구성섹션을 설정하는 방법 [1]
519이진형12/8/200612216스마트 클라이언트에서 부모 IE 컨트롤 하기
520정성태12/11/200613052    답변글 [답변]: 스마트 클라이언트에서 부모 IE 컨트롤 하기 [3]
517주낙현12/5/200612878Property 재정의가 가능한가요?? [1]
516양덕진11/29/200612481SSL인증서 질문? [1]
515경혜원11/27/200613798화면 캡춰 관련해서 문의 드립니다. [1]
513양덕진11/26/200616100SSL인증문제?
514양덕진11/27/200617919    답변글 [답변]: SSL인증문제? [1]
512윤창일11/24/200615393[ActiveX vs 가장기법] [1]
511방문자11/24/200614104스마트 클라이언트 질문입니다. [3]
509주낙현11/22/200615584스마트 클라이언트에서 WebBrowser 컨트롤사용? [4]
508임장현11/20/200615001서로다른 프로젝트간의 세션공유에 대해 질문드립니다.
510정성태11/22/200613421    답변글 [답변]: 서로다른 프로젝트 간의 세션 공유에 대해 질문드립니다.
504탑.11/10/200614096COM+ 구성 좀 봐주세요...
505정성태11/14/200613820    답변글 [답변]: COM+ 구성 좀 봐주세요...
506탑.11/15/200613104        답변글 [답변]: [답변]: COM+ 구성 좀 봐주세요... [2]
503sagi...11/10/200613038bho 폼 관련 질문입니다/ [1]
501안연준11/7/200613725(SmartClient) 프레임워크 1.1 과 2.0 은 호환이 안된다? [3]
507안연준11/17/200613446    답변글 [답변]: (SmartClient) 프레임워크 1.1 과 2.0 은 호환이 안된다? [1]
498쿠리마10/30/200613856Smart Client를 VC60 MFC Dialog 에서 사용하기
500정성태10/30/200615707    답변글 [답변]: Smart Client를 VC60 MFC Dialog 에서 사용하기 [3]
497이방은10/30/200615960질문 있습니다..ㅡ.ㅠ;
499정성태10/30/200615879    답변글 [답변]: 질문 있습니다..ㅡ.ㅠ; [2]
495엔틱스10/25/200613415안녕하세요. 세션에 관련해서 질문을 올립니다. [2]
493안연준10/25/200614008스마트클라이언트 배포에서 Config 내용이 이해가 안되요
... 76  77  78  [79]  80  81  82  83  84  85  86  87  88  89  90  ...