반응형
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 동시 요청, 장시간 계산 작업 등에서 효율적인 비동기 패턴을 적용하면 생산성을 크게 높일 수 있습니다.
반응형
'c#' 카테고리의 다른 글
C# 파일 입출력과 JSON/XML 처리 (0) | 2025.09.21 |
---|---|
C# 비동기 프로그래밍: async/await와 Task 활용 (0) | 2025.09.21 |
C# LINQ 활용법 – 컬렉션 처리와 데이터 쿼리 (0) | 2025.09.21 |
C# WPF/WinForms GUI 개발: MVVM, 데이터 바인딩, 커스텀 컨트롤 활용 (0) | 2025.09.18 |
C# Entity Framework(Core)와 데이터베이스 연동 (1) | 2025.09.18 |