-
Async, Await웹 서버/고급 C# 문법 2022. 4. 22. 15:39
1. Async의 필요성
Task란 일감을 만들어서 던져주는 개념이다.
using System; using System.Collections.Generic; using System.Reflection; using System.Threading.Tasks; // Task사용하기 위해 선언 namespace CSharp { // async/await // async 이름만 봐도 비동기 프로그래밍! // 게임서버) 비동기 = 멀티쓰레드? -> 꼭 그렇지는 않습니다 // 유니티) Coroutine = 일종의 비동기? but 싱글쓰레드? -> 조금 다르지만 그래도 비슷하다. class Program { static Task Test() { Console.WriteLine("Start Test"); Task t = Task.Delay(3000); // 3초지연 t.Wait(); // Task가 끝날 때까지 기다려줌. Console.WriteLine("End Test"); return t; } static void Main(string[] args) { Task t = Test(); while (true) { } } } }
위의 로직을 분석해보면 "Start Test"가 뜨고 3초후에 "End Test"가 뜨는 것을 알 수 있다.
이렇게 로직을 처리했을 때 Test() 함수가 실행되는 동안 Main함수는 멈춰버리게 된다는 단점이 있다.
Test함수가 진행되는 동안에도 Main함수를 여전히 사용하고 싶을 때 사용하는 것이 Async이다.
2. Async 사용 with await
using System; using System.Collections.Generic; using System.Reflection; using System.Threading.Tasks; namespace CSharp { class Program { static async void TestAsync() { Console.WriteLine("Start TestAsync"); Task t = Task.Delay(3000); // 복잡한 작업으로 3초지연된다고 가정. await t; // 이곳에서 함수를 빠져나옴 Console.WriteLine("End TestAsync"); } static void Main(string[] args) { TestAsync(); Console.WriteLine("Start While"); while (true) { } } } }
보통의 경우에는 "Start TestAsync" -> "End TestAsync" -> "Start While" 순으로 실행이 되겠지만 async를 활용함으로써
"Start TestAsync" -> "Start While" -> "End TestAsync" 순으로 실행되는 것을 볼 수 있다.
그리고 await를 하는 순간에 멀티쓰레드가 생성되는 것을 알아야한다.