본문 바로가기

C#

C# System.Threading.Channels로 비동기 데이터 파이프라인 구성

비동기 프로그래밍에서 데이터 처리 파이프라인을 구성할 때, System.Threading.Channels는 효율적인 데이터 흐름 제어를 돕습니다. 이 글에서는 채널을 사용해 생산자-소비자 패턴을 구현하는 방법을 소개합니다.

1. System.Threading.Channels란?

채널은 비동기 큐와 유사한 구조로, 여러 생산자와 소비자가 안전하고 효율적으로 데이터를 교환할 수 있도록 설계되었습니다.

2. 기본 사용법

먼저 Channel 클래스를 생성하고, 생산자 역할은 데이터를 쓰기, 소비자 역할은 데이터를 읽기로 구현합니다.

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

public class Program
{
    public static async Task Main()
    {
        var channel = Channel.CreateUnbounded<int>();

        // 생산자
        var producer = Task.Run(async () =>
        {
            for (int i = 0; i < 5; i++)
            {
                await channel.Writer.WriteAsync(i);
                Console.WriteLine($"Produced: {i}");
            }
            channel.Writer.Complete();
        });

        // 소비자
        var consumer = Task.Run(async () =>
        {
            await foreach (var item in channel.Reader.ReadAllAsync())
            {
                Console.WriteLine($"Consumed: {item}");
            }
        });

        await Task.WhenAll(producer, consumer);
    }
}

3. 활용 팁

- 버퍼 크기를 설정해 생산자와 소비자의 속도 차이를 조절할 수 있습니다.

- Complete 메서드 호출로 생산자 완료를 알리고, 소비자가 정상 종료하도록 합니다.

- 예외 처리를 통해 안정성을 높이세요.

System.Threading.Channels는 복잡한 비동기 파이프라인을 간단하고 안정적으로 구축할 수 있어 현대 C# 비동기 개발에 유용합니다.