선생님 안녕하세요!
비동기 코드 흐름이 궁금해서 질문 드립니다!
example.txt 내용은 아래와 같습니다.
01.여기는 서울입니다.
02.여기는 경기도입니다.
03.여기는 부산입니다.
namespace Test
{
class Program
{
static void Main(string[] args)
{
RunAsync();
Console.ReadLine();
}
private static async void RunAsync()
{
string text = await TextReaderSample.ReadTextAsync("example.txt");
Console.Write(text);
}
}
static class TextReaderSample
{
public static async Task<string> ReadTextAsync(string filePath)
{
StringBuilder sb = new StringBuilder();
StreamReader sr = new StreamReader(filePath);
while (!sr.EndOfStream)
{
string line = await sr.ReadLineAsync(); // ★★★
Print();
sb.AppendLine(line);
}
return sb.ToString();
}
public static void Print()
{
Console.WriteLine("Main Thread Working");
}
}
}
[출력]
Main Thread Working
01.여기는 서울입니다.
02.여기는 경기도입니다.
03.여기는 부산입니다.
[질문 1] 저는 코드가 아래와 같이 동작한다고 생각하는데 혹시 틀린 부분이 있을까요?
① Main Thread가 RunAsync()를 실행(호출)한다.
② Main Thread가 TextReaderSample.ReadTextAsync("example.txt")를 실행(호출)한다.
③ Main Thread는 StringBuilder, StreamReader 객체를 생성 후
반복문 안으로 들어온다.
④ ReadLineAsync는 스레드 풀에 있는 작업 스레드로 실행한다.
작업 스레드가 ReadLineAsync 처리를 완료할 때까지
Main Thread는 sr 앞에 있는 await 키워드에서 대기한다.
작업 스레드가 ReadLineAsync 처리를 완료했다면 결과를 Main Thread가 넘겨받는다.
⑤ Main Thread는 Print()를 실행 후,
StringBuilder 객체에 추가(AppendLine)한다.
⑤ Main Thread가 TextReaderSample.ReadTextAsync() 밖으로 벗어나서
RunAsync()안에 있는 Console.Write(text);를 실행한다.
⑥ Main Thread가 RunAsync() 밖으로 벗어나서 Main 문으로 돌아온다.
[질문 2] ReadLineAsync()를 작업 스레드가 실행하는데
혹시 작업 스레드도 Main Thread처럼 ID 출력할 수 있는 방법이 있을까요?
선생님께서 알려주신 Thread.CurrentThread.ManagedThreadId로는 작업 스레드의 id를 확인하는 것이 어려운 것 같습니다..
[질문 3]
② string line = await sr.ReadLineAsync(); 를 아래와 같이 수정했다면
Task<string> returnedTaskTResult = sr.ReadLineAsync();
Print();
string line = await returnedTaskTResult;
스레드 풀에 있는 작업 스레드가 ReadLineAsync()를 처리하는 동안
Main Thread는 Print()를 처리한 후에 returnedTaskTResult 앞에 있는 await 키워드 앞에서
ReadLineAsync()의 결과 값을 기다린다고 생각해도 될까요?
[최초 등록일: ]
[최종 수정일: 5/23/2021]