웹 서버/고급 C# 문법
Async, Await
코다람쥐
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를 하는 순간에 멀티쓰레드가 생성되는 것을 알아야한다.