코다람쥐 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를 하는 순간에 멀티쓰레드가 생성되는 것을 알아야한다.