async static Task LongTask()
{
for (int i = 0; i < 100000000; i++)
{
// 대충 엄청 빡센 작업
}
Console.WriteLine("Long Task Done");
}
async static void ExecuterA()
{
Console.WriteLine("A Before");
await LongTask(); // LongTask() 직접 호출
Console.WriteLine("A After");
}
async static void ExecuterB()
{
Console.WriteLine("B Before");
await Task.Run(LongTask); // LongTask() 스레딩
Console.WriteLine("B After");
}
public static void Main(string[] args)
{
Console.WriteLIne("Before");
ExecuterA(); 혹은 ExecuterB();
Console.WriteLine("After");
//
다른작업
}
ExecuterA()를 실행했을때:
Before
A Before
Long Task Done
A After
After
ExecuteB()를 실행했을 때:
Before
B Before
After
Long Task Done
B After
이렇게 나오는 이유가 ExecuterA()는 어차피 호출자 스레드에서 LongTask() 까지 직접 계산하기 때문에 await을 만나도 LongTask()는 완료되었기 때문에 동기적으로 처리된거고
ExecuterB()는 LongTask()를 다른 스레드로 날렸고 아직 완료되지 않았으니까 await에서 컨티뉴에이션 기록하고 반환된 후에 이따가 Long Task Done, B After 출력한거 맞나요?
Task.Run 은 새로운 스레드를 만들어서 작업을 시키고 메인스레드에서는 다음 줄을 실행시킴.
await LongTask(); << 새로운 스레드를 만들지 않았음.
난 개인적으로 unitask를 좋아함.