비동기 스트림은 C#과 .NET에서 비동기적인 데이터 시퀀스를 처리할 수 있는 방법을 제공한다.
이 상황에서 데이터를 기다리는 동안에 다른 작업을 계속 수행할 수 있다.
1IAsyncEnumerable<T>
인터페이스
비동기적으로 요소를 하나씩 열거할 수 있도록 지원한다.
C#에서는 await foreach 구문을 활용하여 이런 비동기 스트림을 손쉽게 반복할 수 있다.
비동기열거자 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 break
을 사용하여 과정을 완전히 중단한다.