728x90
    
    
  📘 개념 요약
비동기 메서드는 기본적으로 async와 await 키워드를 사용하여 비동기적으로 실행됩니다. 하지만 콘솔 앱이나 초기 Main() 함수 등에서는 비동기 메서드를 동기 방식으로 실행해야 할 때가 있습니다.
이를 위해 사용하는 대표적인 방법이 다음 두 가지입니다:
- Task.Wait()
 - Task.GetAwaiter().GetResult()
 
🧠 용어 설명
| 용어 | 설명 | 
| Task | 비동기 작업을 나타내는 .NET 객체. Task<T>는 반환값 포함 | 
| Wait() | 비동기 작업을 블로킹 방식으로 기다림 | 
| GetAwaiter().GetResult() | 비동기 작업의 결과를 예외 래핑 없이 직접 가져옴 | 
| AggregateException | Wait() 사용 시 예외가 감싸져 반환되는 타입 | 
| 데드락(Deadlock) | UI 스레드가 기다리는 동안 자신이 필요한 작업도 못 하게 되어 무한 대기하는 상태 | 
💻 예제 1 – DownloadDataAsync().Wait();
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
    public static async Task DownloadDataAsync()
    {
        using (HttpClient client = new HttpClient())
        {
            string result = await client.GetStringAsync("https://jsonplaceholder.typicode.com/posts/1");
            Console.WriteLine("응답 데이터:");
            Console.WriteLine(result);
        }
    }
    static void Main(string[] args)
    {
        try
        {
            // 비동기 메서드를 동기적으로 대기
            DownloadDataAsync().Wait();  
        }
        catch (AggregateException ex)
        {
            Console.WriteLine($"예외 발생: {ex.InnerException?.Message}");
        }
    }
}
✅ 특징:
- Wait()은 현재 스레드를 멈춰서 기다림
 - 예외 발생 시 AggregateException으로 감싸짐
 
💻 예제 2 – DownloadDataAsync().GetAwaiter().GetResult();
static void Main(string[] args)
{
    try
    {
        // 비동기 메서드를 동기적으로 결과 획득
        DownloadDataAsync().GetAwaiter().GetResult();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"예외 발생: {ex.Message}");
    }
}
✅ 특징:
- .GetAwaiter().GetResult()는 예외를 감싸지 않고 직접 던짐
 - Wait()보다 디버깅 시 유리함
 
🔧 언제 어떤 걸 써야 할까?
상황추천 방식이유
| 콘솔 앱에서 한 번만 실행 | Wait() | 간단함 | 
| 예외 디버깅이 중요할 때 | GetResult() | 원본 예외 확인 가능 | 
| UI 앱 (WPF, WinForms, ASP.NET 등) | ❌ 사용 지양 | 데드락 발생 가능성 | 
| C# 7.1 이상 & Main 함수 | async Task Main() | 가장 안전하고 권장 | 
// C# 7.1 이상에서 가장 좋은 방법
static async Task Main(string[] args)
{
    await DownloadDataAsync();
}
📝 핵심 정리
| 항목 | .Wait() | .GetAwaiter() GetResult() | 
| 예외 전달 | AggregateException로 감싸짐 | 원래 예외 그대로 전달 | 
| 코드 가독성 | 간단함 | 다소 복잡함 | 
| 디버깅 | 불편 | 유리 | 
| 데드락 위험 | 있음 | 있음 | 
| 콘솔 앱 사용 | 가능 | 가능 | 
| UI 앱 사용 | 비추천 | 비추천 | 
🏷 추천 태그
C#, 비동기, Task, async await, GetAwaiter, Wait, 예외처리, 콘솔앱, UI 데드락, 프로그래밍 기초, 동기 vs 비동기, 코드 분석
728x90
    
    
  '개발 언어 & 프레임워크 > C# 프로그래밍 마스터하기' 카테고리의 다른 글
| 인터페이스와 의존성 주입(DI) 구조 설계 (0) | 2025.05.29 | 
|---|---|
| LINQ (Language Integrated Query) 활용법 완전 정복 (0) | 2025.05.29 | 
| 상수와 열거형, Nullable 및 var 형식 완벽 정리 (0) | 2024.12.14 | 
| 데이터 형식 총정리: 값 형식, 참조 형식, 박싱과 언박싱까지 (0) | 2024.12.14 | 
| 변수와 메모리 구조: 프로그래머가 알아야 할 변수의 개념과 동작 원리 (2) | 2024.12.14 |