직원이 한 명 뿐인 식당이 있다. 직원은 설거지, 요리, 주문, 서빙을 모두 담당해야 한다.
async도 멀티스레드가 아닌 싱글스레드에서 활용되는 경우가 있다.
static async void TestAsync()
{
Console.WriteLine("Start TestAsync");
Task t = Task.Delay(3000);
t.Wait();
Console.WriteLine("End TestAsync");
}
static void Main(string[] args)
{
TestAsync();
Console.WriteLine("while start");
while (true)
{
}
}
메인에서는 TestAsync()를 실행한 뒤 while start라는 문장을 프린트한다. TestAsync 안에서 3초의 딜레이를 주고 t.Wait을 통해 기다리라는 명령을 하고 있으니 3초가 지날 때까지 "End TestAsync"와 "while start"는 프린트되지 않을 것이다.
3초 후
이렇게 3초가 지나야만 "End TestAsync"와 "while start"가 출력됐다.
식당에서 직원이 설거지를 하는 도중에 손님이 들어와 주문을 받으려고 할 때, 직원이 설거지를 끝낼 때까지 주문을 받을 수 없다고 말한다면 손님이 어떻게 생각할까? 매우 비효율적인 업무를 한다고 생각할 것이다. 직원은 상황에 맞게 자신의 업무가 끝나지 않은 경우에도 다른 업무를 탄력적으로 조절할 수 있어야 한다.
위 상황에서도 마찬가지이다. 3초의 시간이 흐르지 않았어도 "while start"가 출력되는 게 효율적이라 할 수 있다. 이때 활용할 수 있는 것이 await이다.
static async void TestAsync()
{
Console.WriteLine("Start TestAsync");
await Task.Delay(3000);
Console.WriteLine("End TestAsync");
}
t.Wait 대신 await를 넣고 프로그램을 실행하면
3초 후
우리가 원하는 데로 3초가 흐르지 않아도 "while start"가 실행되는 모습을 확인할 수 있다. 3초가 지나지 않아도 제어권이 TestAsync에서 메인으로 넘어가서 "while start"가 출력되는 것이다.
참고로 "End TestAsync"는 멀티스레드로 잡혀서 출력됐다.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/
Asynchronous programming in C#
An overview of the C# language support for asynchronous programming using async, await, Task, and Task
docs.microsoft.com
'공부 > 게임 서버' 카테고리의 다른 글
[게임 서버] 게임 해킹에 대해 알아보자 (0) | 2022.09.30 |
---|---|
[게임 서버/암호학] 대칭키와 비대칭키 (0) | 2022.09.30 |
[게임 서버] SetBuffer를 RecvBuffer, SendBuffer로 따로 빼내기 #2 (0) | 2022.06.21 |
[게임 서버] SetBuffer를 RecvBuffer, SendBuffer로 따로 빼내기 #1 (0) | 2022.06.20 |
[게임 서버] Listener, 네트워크 연결을 기다려보자 (0) | 2022.06.20 |