[C#] Task와 Parallel.For 설명 및 활용법

2025. 4. 17. 09:27개발이야기

728x90
반응형

C#으로 개발하다 보면 TaskParallel.For는 자주 접하게 됩니다.
특히 비동기 처리대량 데이터 처리, UI 멈춤 방지를 할 때 필수적으로 사용되죠.

이 글에서는 두 개념을 확실히 구분하고, 실제로 어떻게 사용하는지 코드 예시와 함께 정리해보겠습니다.


1. Task - 비동기 프로그래밍의 기본 단위

-. Task란?

Task는 .NET에서 비동기 작업을 처리하기 위한 대표적인 클래스입니다.

쉽게 말하면, "이 작업은 백그라운드에서 처리하고 끝나면 알려줘" 라는 개념입니다.

-.  핵심 특징

  • 비동기 실행: UI 쓰레드를 막지 않음
  • await로 작업 완료 기다릴 수 있음
  • Task.Run으로 쉽게 실행 가능

-.  사용 예제

// 무거운 작업을 백그라운드에서 실행
await Task.Run(() =>
{
    LongRunningOperation();
});

void LongRunningOperation()
{
    Thread.Sleep(3000); // 3초 대기 시뮬레이션
    Console.WriteLine("작업 완료");
}

2. Parallel.For - 병렬 루프 처리

-.  Parallel.For란?

Parallel.For는 반복 작업을 여러 쓰레드로 나눠서 동시에 처리해주는 기능입니다.

반복문이 많을 때 하나씩 처리하지 않고 여러 개를 동시에 돌리는 방식입니다.

-.  핵심 특징

  • CPU 코어를 최대한 활용함
  • 순차 루프보다 훨씬 빠를 수 있음
  • 단, 병렬 처리에 적합하지 않은 작업은 오히려 느려질 수 있음

-.  사용 예제

Parallel.For(0, 10, i =>
{
    Console.WriteLine($"{i} 처리 중 - 쓰레드: {Thread.CurrentThread.ManagedThreadId}");
    Thread.Sleep(500); // 작업 시뮬레이션
});

3. Task와 Parallel.For 차이점

항목TaskParallel.For

목적 비동기 실행 병렬 반복 처리
주로 쓰는 상황 UI 멈춤 방지, 백그라운드 실행 대량 루프 처리 속도 개선
작성 형태 Task.Run() 또는 async/await Parallel.For(start, end, action)
내부 스레드 쓰레드풀 쓰레드풀 (다중 스레드)

4. 실무 적용 예시

1) UI를 멈추지 않고 처리

// UI 앱에서 버튼 클릭 시
private async void btnStart_Click(object sender, EventArgs e)
{
    btnStart.Enabled = false;
    await Task.Run(() => LongCalculation());
    btnStart.Enabled = true;
}

2) 대량 데이터 병렬 저장

Parallel.For(0, 100, i =>
{
    SaveToIniFile(i); // INI 저장 예시
});

5. 주의할 점

  • Parallel.For 안에서는 UI 접근을 절대 하면 안 됨 (Control.Invoke 필요)
  • 과도한 쓰레드 생성은 성능 저하 유발 가능
  • 작업 간 공유 리소스가 있을 경우 락 처리 필수

TaskParallel.For는 서로 역할이 다릅니다. 하지만 함께 쓰면 강력한 성능 최적화가 가능합니다.

  • Task: 작업을 비동기로 실행 (UI 안 멈추게 하기 위함)
  • Parallel.For: 반복 작업을 병렬로 처리 (속도 개선 목적)

실제 프로젝트에서는 두 개를 조합해서 사용하는 경우가 많습니다.

728x90
반응형