async 한정자, await 연산자(비동기 코드 구현)

00·2025년 1월 17일

C#

목록 보기
146/149

개요

C#에서 asyncawait는 비동기 프로그래밍을 쉽게 구현할 수 있도록 도와주는 핵심 키워드이다. 마치 요리사가 여러 요리를 동시에 준비하는 것과 같이, async와 await를 사용하면 프로그램이 여러 작업을 동시에 처리하면서도 코드는 간결하고 읽기 쉽게 유지할 수 있다.

async 한정자

  • 메서드를 비동기 메서드로 선언할 때 사용한다.
  • async로 선언된 메서드는 일반적으로Task 또는 Task<T> 객체를 반환한다.
  • Task는 비동기 작업을 나타내는 객체이고, Task<T> 는 결과 값을 반환하는 비동기 작업을 나타낸다.
  • async 메서드 내부에는 await 연산자를 사용할 수 있다.

await 연산자

  • 비동기 작업이 완료될 때까지 기다린다(메서드의 실행을 일시 중지한다).
  • await 연산자는 async로 선언된 메서드 내에서만 사용할 수 있다.
  • await 연산자는 Task 또는 Task<T> 객체를 반환하는 비동기 메서드에 사용할 수 있다(Task 또는 Task<T> 객체를 반환하는 메서드 앞에 사용된다).

asyncawait를 사용하는 이유

  • 응답성 향상: 비동기 작업을 수행하는 동안 UI 스레드가 멈추지 않도록 하여 애플리케이션의 응답성을 향상시킬 수 있다. 즉, 비동기 작업을 사용하면 프로그램이 작업이 완료될 때까지 UI를 멈추지 않고 다른 작업을 계속 수행할 수 있으므로, 사용자 경험을 향상시키는 데 도움이 된다.
  • 코드 간결화: asyncawait를 사용하면 비동기 코드를 동기 코드처럼 작성할 수 있다. 따라서 코드의 가독성과 유지보수성을 높이는 데 도움이 된다.
  • 성능 향상: 비동기 작업을 사용하면 CPU를 효율적으로 사용할 수 있다. CPU가 하나의 작업을 기다리는 동안 다른 작업을 수행할 수 있기 때문이다.

사용 방법

  1. 메서드에 async 한정자를 추가한다.
  2. Task 또는 Task<T>를 반환하도록 메서드의 반환 타입을 변경한다.
  3. 비동기 작업을 수행하는 메서드 호출 앞에 await 연산자를 추가한다.

사용 예시(1)

async Task MyMethodAsync()
{
    // 비동기 작업 수행
    await Task.Delay(1000); // 1초 대기

    // 비동기 작업 완료 후 실행될 코드
}

이 코드에서 MyMethodAsync() 메서드는 async 키워드를 사용하여 비동기 메서드로 선언되었다. await Task.Delay(1000);는 1초 동안 비동기적으로 대기하는 코드이다. await 키워드를 사용하면 Task.Delay() 메서드가 완료될 때까지 MyMethodAsync() 메서드의 실행이 일시 중지되고, 다른 작업을 수행할 수 있다.

사용 예시2

using System;
using System.Threading.Tasks;

class AsyncExample
{
    async static Task<int> DelayAndReturnAsync(int delay, int value)
    {
        await Task.Delay(delay); // delay 밀리초 동안 대기한다
        return value; // value를 반환한다
    }

    static async Task Main(string[] args)
    {
        Task<int> task = DelayAndReturnAsync(2000, 42); // 2초 후에 42를 반환하는 비동기 작업을 시작한다

        Console.WriteLine("비동기 작업을 시작했습니다."); // 비동기 작업이 실행되는 동안 다른 작업을 수행할 수 있다

        int result = await task; // 비동기 작업이 완료될 때까지 기다린 후 결과 값을 가져온다

        Console.WriteLine($"결과: {result}"); // 결과 값을 출력한다
    }
}

예제 코드

using System; // System 네임스페이스를 사용한다.
using System.Threading.Tasks; // Task 클래스를 사용하기 위해 필요하다.

namespace Async // Async 네임스페이스를 정의한다.
{
    class MainApp // MainApp 클래스를 정의한다.
    {
        async static private void MyMethodAsync(int count) // 비동기 메서드 MyMethodAsync를 정의한다. count는 반복 횟수를 나타낸다.
        {
            Console.WriteLine("C"); // 콘솔에 "C"를 출력한다.
            Console.WriteLine("D"); // 콘솔에 "D"를 출력한다.

            await Task.Run(async () => // Task.Run() 메서드를 사용하여 비동기적으로 작업을 실행한다.
            {
                for (int i = 1; i <= count; i++) // 1부터 count까지 반복한다.
                {
                    Console.WriteLine($"{i}/{count} ..."); // 콘솔에 현재 진행 상황을 출력한다.
                    await Task.Delay(100); // 100밀리초 동안 대기한다.
                }
            });

            Console.WriteLine("G"); // 콘솔에 "G"를 출력한다.
            Console.WriteLine("H"); // 콘솔에 "H"를 출력한다.
        }

        static void Caller() // Caller 메서드를 정의한다.
        {
            Console.WriteLine("A"); // 콘솔에 "A"를 출력한다.
            Console.WriteLine("B"); // 콘솔에 "B"를 출력한다.

            MyMethodAsync(3); // MyMethodAsync 메서드를 호출한다. count는 3으로 설정된다.

            Console.WriteLine("E"); // 콘솔에 "E"를 출력한다.
            Console.WriteLine("F"); // 콘솔에 "F"를 출력한다.
        }

        static void Main(string[] args) // 프로그램의 진입점인 Main 메서드를 정의한다.
        {
            Caller(); // Caller 메서드를 호출한다.

            Console.ReadLine(); // 프로그램 종료 방지
        }
    }
}

코드 설명

이 C# 코드는 asyncawait 키워드를 사용하여 비동기 메서드를 구현하는 방법을 보여주는 예제 코드이다. 비동기 메서드는 메서드 실행이 완료될 때까지 기다리지 않고 다른 작업을 수행할 수 있도록 하는 메서드이다.

MyMethodAsync() 메서드

  • async 키워드를 사용하여 비동기 메서드로 선언되었다.
  • Task.Run() 메서드를 사용하여 새로운 스레드에서 비동기 작업을 실행한다.
  • await 키워드를 사용하여 비동기 작업이 완료될 때까지 기다린다.
  • Task.Delay() 메서드를 사용하여 100밀리초 동안 대기한다.

Caller() 메서드

  • MyMethodAsync() 메서드를 호출한다.

Main 메서드

  • Caller 메서드를 호출한다.
  • Console.ReadLine() 메서드를 사용하여 사용자 입력을 기다린다.

코드 실행 순서

  1. Main 메서드에서 Caller 메서드를 호출한다.
  2. Caller 메서드에서 "A"와 "B"를 출력한다.
  3. Caller 메서드에서 MyMethodAsync 메서드를 호출한다.
  4. MyMethodAsync 메서드에서 "C"와 "D"를 출력한다.
  5. MyMethodAsync 메서드에서 Task.Run() 메서드를 사용하여 새로운 스레드에서 비동기 작업을 실행한다.
  6. MyMethodAsync 메서드에서 await 키워드를 사용하여 비동기 작업이 완료될 때까지 기다린다.
  7. 비동기 작업이 완료되면 MyMethodAsync 메서드에서 "G"와 "H"를 출력한다.
  8. Caller 메서드에서 "E"와 "F"를 출력한다.
  9. Main 메서드에서 Console.ReadLine() 메서드를 사용하여 사용자 입력을 기다린다.

출력 결과

A
B
C
D
E
F
1/3 ...
2/3 ...
3/3 ...
G
H

참고

  • async 키워드는 메서드가 비동기적으로 실행될 수 있음을 나타낸다.
  • await 키워드는 비동기 작업이 완료될 때까지 메서드의 실행을 일시 중지한다.
  • Task.Run() 메서드는 새로운 스레드에서 비동기 작업을 실행한다.
  • Task.Delay() 메서드는 지정된 시간 동안 대기한다.

0개의 댓글