공부/게임 서버

[게임 서버] await 사용하기

돌멩이수프 2022. 7. 11. 20:02
728x90

직원이 한 명 뿐인 식당이 있다. 직원은 설거지, 요리, 주문, 서빙을 모두 담당해야 한다.

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

 

728x90