c#

C# 비동기 프로그래밍 : PLINQ, CancellationToken, 고급 Task 제어

개발에대해 2025. 9. 21. 22:53
반응형

 

C# 비동기 프로그래밍 심화: PLINQ, CancellationToken, 고급 Task 제어

이전 글에서 async/await와 Task를 활용한 기본 비동기 프로그래밍을 살펴보았습니다.

이번 글에서는 병렬 LINQ(PLINQ), CancellationToken, 고급 Task 제어를 대한 자세한 내용을 다룹니다.

 

1. 병렬 LINQ(PLINQ)

PLINQ는 기존 LINQ 쿼리를 멀티스레드로 병렬 처리할 수 있는 기능입니다.

CPU 연산이 많은 데이터 처리에서 성능을 크게 향상시킬 수 있습니다.

 


using System;
using System.Linq;

int[] numbers = Enumerable.Range(1, 1000000).ToArray();

// 일반 LINQ
var evenNumbers = numbers.Where(n => n % 2 == 0).ToArray();

// PLINQ
var parallelEvenNumbers = numbers.AsParallel()
                                 .Where(n => n % 2 == 0)
                                 .ToArray();
  

 

AsParallel()만 추가해도 데이터 처리를 병렬로 수행하며, 대규모 데이터 처리에 적합합니다.

 

2. CancellationToken으로 작업 취소 처리

 

장시간 실행되는 Task는 사용자 요청이나 타임아웃에 따라 취소할 수 있어야 합니다.

CancellationToken을 활용하면 안전하게 작업을 중단할 수 있습니다.


using System;
using System.Threading;
using System.Threading.Tasks;

CancellationTokenSource cts = new CancellationTokenSource();

Task longTask = Task.Run(() => {
    for (int i = 0; i < 10; i++) {
        cts.Token.ThrowIfCancellationRequested();
        Console.WriteLine("작업 진행중: " + i);
        Thread.Sleep(1000);
    }
}, cts.Token);

// 3초 후 취소
Task.Delay(3000).ContinueWith(t => cts.Cancel());

try {
    longTask.Wait();
} catch (AggregateException ex) {
    Console.WriteLine("작업이 취소되었습니다.");
}
  

 

3. 고급 Task 제어: Task.WhenAll, Task.WhenAny

 

여러 비동기 작업을 동시에 처리하거나 가장 먼저 완료된 작업만 활용할 때 유용합니다.


Task task1 = Task.Delay(2000);
Task task2 = Task.Delay(4000);

// 모든 작업 완료 대기
await Task.WhenAll(task1, task2);
Console.WriteLine("모든 작업 완료");

// 가장 먼저 완료된 Task 활용
Task firstCompleted = await Task.WhenAny(task1, task2);
Console.WriteLine("가장 먼저 완료된 작업 완료");
 

4. 실무 활용 팁

  • CPU 바운드 연산: PLINQ 활용 → 멀티코어 최대 활용
  • I/O 바운드 연산: async/await 사용 → UI와 서버 응답성 유지
  • 취소 가능 작업: CancellationToken 필수 → 장시간 작업 중단 가능
  • 병렬 Task 관리: Task.WhenAll, Task.WhenAny → 여러 API 요청 처리 최적화
  • 예외 처리: Task.Wait 또는 await try/catch → 모든 비동기 예외 안전 처리

 

마무리

PLINQ, CancellationToken, 고급 Task 제어를 살펴보았습니다.

병렬 처리와 안전한 작업 취소, 여러 Task 제어는 실무 프로젝트에서 매우 유용하며, 성능과 안정성을 동시에 향상시킬 수 있습니다. 특히 대규모 데이터 처리, 서버 API 동시 요청, 장시간 계산 작업 등에서 효율적인 비동기 패턴을 적용하면 생산성을 크게 높일 수 있습니다.

반응형