비동기 스트림 ( yield - await foreach )

냐옹·2024년 4월 12일
0

.NET

목록 보기
29/31

비동기스트림

비동기 스트림은 C#과 .NET에서 비동기적인 데이터 시퀀스를 처리할 수 있는 방법을 제공한다.

  • 시간이 오래 걸릴 수 잇있는 소스에서 데이터가 계속 도착하는 경우에 유용하다.

이 상황에서 데이터를 기다리는 동안에 다른 작업을 계속 수행할 수 있다.

  • 어플리케이션의 응답성, 리소스 사용이 보다 효율적으로 관리된다.

요소

  1. 1IAsyncEnumerable<T> 인터페이스
    비동기적으로 요소를 하나씩 열거할 수 있도록 지원한다.
    C#에서는 await foreach 구문을 활용하여 이런 비동기 스트림을 손쉽게 반복할 수 있다.

  2. 비동기열거자 IAsyncEnumerator<T>
    각 비동기 스트림은 IAsyncEnumeraot<T> 를 사용하여 요소를 열거한다. 이 열거자는 MoveNextAsync메서드를 통해서 다음 요소로 비동기적으로 이동할 수 있으며, Current 프로퍼티를 통해 현재 요소에 접근한다.

public class NetworkDataReceiver
{
    public static async Task Main(string[] args)
    {
    	// 이부분 중요 
        await foreach(var packet in ReceiveDataPacketsAsync())
        {
            Console.WriteLine($"Received : {packet}");
        }
    }
    public static async IAsyncEnumerable<string> ReceiveDataPacketsAsync()
    {
        string[] packets = new string[] { "Packet1", "Packet2", "Packet3"};

        foreach (var packet in packets)
        {
            await Task.Delay(1000);
            yield return packet;
        }
    }
}

yield return

프로그램에서 데이터의 목록 ( 숫자 목록 , 문자열 목록 등 )을 처리할 때 하나씩 차례대로 다루고 싶을 때 사용한다.
메서드가 yield return을 만나면 현재의 요소를 메서드를 호출한 곳에 전달하고 그 위치에서 잠시 멈춘다.
호출자가 다음 요소를 요청하면 멈춘 부분부터 다시 시작하여 다음 요소를 처리한다.

yield break

데이터를 생성하는 과정에서 더이상 데이터를 반환하지 않기를 원하면 yield break을 사용하여 과정을 완전히 중단한다.

0개의 댓글