ABOUT ME

-

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

    '웹 서버 > 고급 C# 문법' 카테고리의 다른 글

    LINQ  (0) 2022.04.22
Designed by Tistory.