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 출력한거 맞나요?