728x90

📘 개념 요약

개념 설명
Thread 저수준 병렬 처리 방식으로, 개발자가 직접 스레드 생성/관리
Task .NET에서 제공하는 고수준 병렬 처리 방식으로, 스레드 풀 기반
Parallel 반복 작업을 병렬로 쉽게 수행하기 위한 고급 API (내부적으로 Task 사용)
 

💻 실제 코드 성능 비교 예제

// Thread 방식
for (int i = 0; i < 5; i++)
{
    new Thread(() =>
    {
        Console.WriteLine($"[Thread] 작업 {i} - ID: {Thread.CurrentThread.ManagedThreadId}");
        Thread.Sleep(200);
    }).Start();
}

// Task 방식
for (int i = 0; i < 5; i++)
{
    Task.Run(() =>
    {
        Console.WriteLine($"[Task] 작업 {i} - ID: {Thread.CurrentThread.ManagedThreadId}");
        Thread.Sleep(200);
    });
}

// Parallel 방식
Parallel.For(0, 5, i =>
{
    Console.WriteLine($"[Parallel] 작업 {i} - ID: {Thread.CurrentThread.ManagedThreadId}");
    Thread.Sleep(200);
});

🧠 성능 비교 (정량적 요약)

항목 Thread Task Parallel.For
생성 속도 느림 (새 스레드 생성) 빠름 (스레드풀 재사용) 매우 빠름 (Task 활용 최적화)
메모리 사용 상대적으로 높음 적음 적음
스케줄링 개발자가 직접 관리 .NET이 자동 관리 자동 병렬 분할
예외 처리 try-catch 직접 필요 간편 (await, ContinueWith) 약간 복잡함
컨트롤 높음 (우선순위 등) 중간 (제한적 컨트롤) 낮음 (고정된 패턴)
확장성 낮음 (스레드 과다 시 시스템 부하) 높음 높음 (병렬 루프 자동 분배)
 

🧪 실제 성능 차이 실험 (예시 시나리오)

작업 수: 1000개, 각각 50ms 대기

  • Thread:
    • 생성 비용 ↑
    • 컨텍스트 스위칭 많음 → CPU 부하 증가
    • 스레드 개수 많아지면 성능 급하락
  • Task:
    • 스레드 풀 기반이라 리소스 절약
    • 처리 속도 일정, 확장성 우수
  • Parallel:
    • CPU 코어 수만큼 자동 분할 실행
    • 단순 반복문에서는 최강 성능

🔧 사용법 요약

사용 상황 추천 도구
스레드 우선순위 제어, 백그라운드 스레드 필요 Thread 직접 사용
병렬 연산, 백그라운드 API 호출 Task, Task.Run
대량 반복 작업, 빠른 계산 Parallel.For, Parallel.ForEach
 

📝 결론 요약

  • Thread는 지금은 거의 특수 상황에만 사용됨 (직접 스레드 제어 필요할 때)
  • Task는 범용 병렬 처리 및 비동기 처리의 기본
  • Parallel은 반복 작업의 병렬 최적화에 최적

💡 실무에서는 대부분 Task와 Parallel을 사용하며, Thread는 병렬 제어가 필요한 특수 케이스에서만 권장됩니다.


🏷 추천 태그

C#, Thread, Task, Parallel, 스레드 풀, 병렬처리, 멀티스레딩, 성능 비교, 비동기, Concurrency, 스레드 최적화


🎯 실전 팁

  • async/await 기반 Task는 비동기 I/O 작업에 최적
  • Parallel.For는 CPU 바운드 작업에 최적
  • 병렬 작업 수가 많고 짧을수록 Task 또는 Parallel을,
    작업 시간이 길고 독립적일수록 Thread를 사용하면 됩니다.
728x90
728x90

📘 개념 요약

비동기 메서드는 기본적으로 async와 await 키워드를 사용하여 비동기적으로 실행됩니다. 하지만 콘솔 앱이나 초기 Main() 함수 등에서는 비동기 메서드를 동기 방식으로 실행해야 할 때가 있습니다.

이를 위해 사용하는 대표적인 방법이 다음 두 가지입니다:

  1. Task.Wait()
  2. 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

+ Recent posts