C#비동기와 이벤트

async / await 기본 패턴

I/O 작업을 기다리는 동안 스레드를 막지 않고 자연스럽게 이어가는 C# 비동기 기본 패턴입니다.

마지막 수정 2026년 3월 15일

설명

  • 네트워크 요청, 파일 읽기, 데이터베이스 호출처럼 기다리는 시간이 있는 작업에 적합합니다.
  • 에디터 도구나 UI가 멈추지 않게 하면서 백그라운드 대기를 처리할 수 있습니다.
  • 연산량이 많은 CPU 작업을 무조건 async로 해결하는 것은 아닙니다. async는 "기다림"에 강합니다.

기본 패턴

csharp
public async Task<string> LoadDataAsync(HttpClient http)
{
    using HttpResponseMessage response = await http.GetAsync("/api/items");
    response.EnsureSuccessStatusCode();

    return await response.Content.ReadAsStringAsync();
}

빠른 정리

규칙이유
Task 또는 Task<T> 반환호출하는 쪽에서 await 할 수 있고 예외도 추적하기 쉽습니다.
async void는 피하기이벤트 핸들러 외에는 예외 흐름을 관리하기가 어렵습니다.
진짜 비동기 API를 await 하기동기 코드를 Task.Run으로 감싸는 것은 병목을 숨길 뿐입니다.
취소 토큰 전달하기긴 대기 작업을 사용자 흐름에 맞게 중단할 수 있습니다.

이미지

현재 메서드는 await 지점에서 잠시 멈췄다가, 작업이 끝나면 다음 줄부터 다시 이어집니다.

주의할 점

async 흐름으로 유지할 수 있는 코드에서 .Result.Wait()로 강제로 막지 않는 편이 좋습니다. 이런 패턴은 데드락이나 응답성 저하를 자주 유발합니다.