728x90
Task Parallel Library(TPL)는 C# 개발자들에게 병렬 및 비동기 프로그래밍을 보다 쉽게 구현할 수 있는 강력한 도구입니다. 이 블로그 포스트에서는 TPL의 주요 개념과 실용적인 예제를 통해 TPL을 활용하는 방법을 알아보겠습니다.
TPL의 주요 개념
작업(Task)과 스레드(Thread)의 차이
- 작업(Task): 비동기 작업을 나타내며, 다른 작업과 동시에 실행될 수 있습니다. 스레드보다 가벼우며, .NET의 스레드 풀을 사용하여 효율적으로 스레드를 공유합니다.
병렬 처리(Parallelism)와 동시성(Concurrency)
- 동시성(Concurrency): 여러 작업이 겹치는 시간대에 실행되는 것을 의미합니다.
- 병렬 처리(Parallelism): 여러 연산이 동시에 수행되는 것을 의미하며, 멀티코어 프로세서를 활용합니다.
TPL의 장점
- 병렬 코드 작성을 단순화합니다.
- CPU 코어를 효과적으로 활용하여 성능을 향상시킵니다.
- 취소 및 연속 작업 처리를 더 잘 지원합니다.
728x90
실용적인 예제
1. 간단한 작업 생성하기
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Task myTask = Task.Run(() =>
{
Console.WriteLine("작업에서 인사합니다!");
});
myTask.Wait();
}
}
2. Task.WhenAll을 사용한 다중 작업 처리
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var urls = new[] { "http://example.com", "http://example.org" };
var fetchTasks = Array.ConvertAll(urls, url => FetchDataAsync(url));
await Task.WhenAll(fetchTasks);
Console.WriteLine("모든 데이터를 가져왔습니다.");
}
static async Task FetchDataAsync(string url)
{
using HttpClient client = new();
string content = await client.GetStringAsync(url);
Console.WriteLine($"{url}에서 {content.Length} 문자를 가져왔습니다.");
}
}
3. 작업에서 예외 처리하기
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
try
{
await PerformRiskyOperation();
Console.WriteLine("작업이 성공적으로 완료되었습니다.");
}
catch (Exception ex)
{
Console.WriteLine($"오류 발생: {ex.Message}");
}
}
static async Task PerformRiskyOperation()
{
await Task.Run(() =>
{
throw new InvalidOperationException("문제가 발생했습니다!");
});
}
}
4. ContinueWith를 사용한 연속 작업
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
var initialTask = Task.Delay(1000);
initialTask.ContinueWith(t =>
{
if(t.IsCompletedSuccessfully)
{
Console.WriteLine("초기 작업이 성공적으로 완료되었습니다.");
}
});
Console.ReadKey();
}
}
5. 데이터 처리에 Parallel.ForEach 사용하기
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
Parallel.ForEach(numbers,
number =>
{
int result = number * number;
Console.WriteLine($"{number}의 제곱은 {result}입니다.");
});
}
}
결론
TPL은 전통적인 스레딩 모델에 대한 고급 추상화를 제공하여 동시 애플리케이션 작성을 단순화하고, 지능적인 스케줄링 메커니즘을 통해 리소스 사용을 최적화합니다. 위의 개념과 예제를 숙달하면, 고급 C#에서 수많은 작업을 효율적이고 효과적으로 수행할 수 있는 응답성 있는 애플리케이션을 개발할 수 있는 능력을 갖추게 될 것입니다.
728x90
'프로그래밍 > C#' 카테고리의 다른 글
| C#에서의 암호화: 안전한 애플리케이션 개발의 필수 요소 (0) | 2025.09.17 |
|---|---|
| .NET 프레임워크의 코드 액세스 보안: 안전한 애플리케이션 개발의 핵심 (0) | 2025.09.17 |
| C#에서 병렬 프로그래밍: PLINQ로 성능 극대화하기 (0) | 2025.09.16 |
| 고급 C# 예외 필터: 견고한 소프트웨어 개발을 위한 필수 도구 (0) | 2025.09.16 |
| 고급 C# 프로그래밍에서 사용자 정의 예외의 중요성 (0) | 2025.09.16 |