기본적으로 위 블로그들에 .wait(), await 의 차이점이 무엇인지는 잘 기술되어 있는데,
이게 초보자 입장에서는 굉장히 추상적인 개념일 수 있다.
어떻게 쓰는지 보다, '왜' 쓰는지 아는것이 더 중요하다.
그래서 이것 저것 뒤져보면
UI 멈추게 안할려고 쓰는게 await 이라고 간단하게 설명하는 사람도 있는데
명확한 설명은 아니다.
많은 초보자들이 wait() 잘만 쓰면서 UI 안멈추게 운용한 기억이 있을것이다.
적절히 wait() 함수를 끝단에 (시간적으로 여유가 있는 곳에) 배치하면
실질적으로 프로그램이 멈출 가능성이 없는곳에서 wait() 함수를 사용하는게 가능하기 때문이다.
Wait() vs await
그렇다면 도대체 둘은 뭐가 다를까?
근본적으로 wait, await 은
'프로그램 종료, 함수 강제 종료' 등을 방지하는 기술이라는 점을 명심하고 아래 내용을 보자.
stackOverFlow 에서 Mas 님은 간단한 예제를 통해 async, await 을 설명한다.
아래는 Mas 의 예제를 조금 수정한 것이다.
using System;
using System.Threading;
using System.Threading.Tasks;
namespace name_
{
class test
{
static void DoAsTask()
{
WriteOutput("1 - Starting");
var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
WriteOutput("2 - Task started");
t.Wait();
WriteOutput("3 - Task completed wait() 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 await 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);
}
static void Main(string[] args)
{
WriteOutput("Program Begin");
DoAsTask();
WriteOutput("-----------------------");
DoAsAsync();
WriteOutput("Program End");
Console.ReadLine();
}
}
}
출력값
위 코드를 그림으로 설명하면 아래와 같다.
즉 function 밖의 Main Thread 가 처리해야될 일이,
현재 Function 내의 분기된 Thread 의 처리 자료 등을 참조하는 일 없이
독립적으로 진행되는 일이라면. await 을 사용하는게 맞다.
await 은 비동기 & 논블럭 용으로 사용되며
Task.Wait() 은 비동기 진행 중 → 동기점을 맞추고, 블럭시키기 위해 사용된다.
+ 23/08/08 기준 후속포스팅 작성.
Async 와 Task 에 관해서 더 상세한 내용을 담았다.
'Programming > C#' 카테고리의 다른 글
[C#]System.Timers.Timer 사용시 Race Condition (0) | 2021.12.22 |
---|---|
[C#] 반복문 캐싱 최적화 (0) | 2021.07.14 |
[C#] StructLayoutAttribute.Pack 필드 설명 (0) | 2021.04.28 |
[C#] Struct 마샬링 및 사용법 (0) | 2021.04.15 |
[C#] C# 에서 대괄호가 가지는 의미, (사전 정의된 속성, 특성) (0) | 2021.04.03 |