프로그래밍/C#

Task Parallel Library (TPL)로 병렬 및 비동기 프로그래밍 마스터하기

shimdh 2025. 9. 16. 21:45
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