이 예는 그 차이를 매우 명확하게 보여줍니다. async / await를 사용하면 호출 스레드가 차단되지 않고 계속 실행됩니다.
static void Main(string[] args)
{
WriteOutput("Program Begin");
// DoAsTask();
DoAsAsync();
WriteOutput("Program End");
Console.ReadLine();
}
static void DoAsTask()
{
WriteOutput("1 - Starting");
var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
WriteOutput("2 - Task started");
t.Wait();
WriteOutput("3 - Task completed with result: " + t.Result);
}
static async Task DoAsAsync()
{
WriteOutput("1 - Starting");
var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
WriteOutput("2 - Task started");
var result = await t;
WriteOutput("3 - Task completed with result: " + result);
}
static int DoSomethingThatTakesTime()
{
WriteOutput("A - Started something");
Thread.Sleep(1000);
WriteOutput("B - Completed something");
return 123;
}
static void WriteOutput(string message)
{
Console.WriteLine("[{0}] {1}", Thread.CurrentThread.ManagedThreadId, message);
}
DoAsTask 출력 :
[1] 프로그램 시작
[1] 1-시작
[1] 2-작업 시작
[3] A-시작한 것
[3] B-무언가를 완성 함
[1] 3-작업 완료 결과 : 123
[1] 프로그램 끝
DoAsAsync 출력 :
[1] 프로그램 시작
[1] 1-시작
[1] 2-작업 시작
[3] A-시작한 것
[1] 프로그램 끝
[3] B-무언가를 완성 함
[3] 3-작업 완료 결과 : 123
업데이트 : 출력에 스레드 ID를 표시하여 예제를 개선했습니다.
Task
10ms가 걸리는 것을 기다리는 것이 실제로Task
스레드에서 10 시간 동안 실행되어 10 시간 동안 전체를 차단하는 경우 어떻게 하시겠습니까?