본문 바로가기

C#

C# 비동기 프로그래밍 async/await

1. 개념 설명

async/await는 비동기 작업을 선언적으로 표현해 I/O 대기 시간을 효율적으로 처리합니다. 메서드를 async로 표시하고 Task/Task<T>를 반환하며, await는 현재 스레드를 차단하지 않고 작업이 완료되면 이어서 실행합니다. 이를 통해 UI 응답성을 유지하고 서버에서 더 많은 동시 요청을 처리할 수 있습니다.

2. 코드 예제

아래 예제는 웹 페이지 문자열 길이와 인위적 딜레이 작업을 동시에 시작한 뒤 결과를 출력합니다.

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task<int> FetchLengthAsync()
    {
        using var client = new HttpClient();
        var content = await client.GetStringAsync("https://example.com");
        return content.Length;
    }

    static async Task<string> DelayMsgAsync()
    {
        await Task.Delay(500);
        return "딜레이 완료";
    }

    static async Task Main()
    {
        Console.WriteLine("시작");
        var lengthTask = FetchLengthAsync();
        var msgTask = DelayMsgAsync();

        await Task.WhenAll(lengthTask, msgTask);
        Console.WriteLine($"메시지: {msgTask.Result}, 길이: {lengthTask.Result}");
        Console.WriteLine("끝");
    }
}

두 작업을 먼저 시작한 뒤 Task.WhenAll로 모두 완료되기를 기다립니다. await는 대기 중 스레드를 점유하지 않아 Console 앱에서도 다른 작업을 진행할 수 있습니다.

3. 주의사항/팁

이벤트 핸들러 외에는 async void를 피하고 Task를 반환하도록 설계합니다. 예외는 await 시 전파되므로 try/catch로 감싸고 필요하면 CancellationToken을 적용합니다. 라이브러리 코드에서는 ConfigureAwait(false)를 고려하고, 독립적인 작업은 Task.WhenAll로 병렬 시작이 성능에 유리합니다.

'C#' 카테고리의 다른 글

C# 레코드 타입 (Record)  (0) 2026.03.27
C# 패턴 매칭 (Pattern Matching)  (0) 2026.03.26
C# LINQ 기초 - Where, Select, OrderBy  (0) 2026.03.26
C# 문자열 보간법 (String Interpolation)  (0) 2026.03.25
폴더 생성하기  (0) 2021.10.19