다양한 처리 방식이 있겠습니다만 IAsyncEnumerable를 사용해서 작성하신 코드를 최대한 유지할 수 있습니다.
using System.Runtime.CompilerServices;
var cts = new CancellationTokenSource();
var count = 0;
await foreach (var plcResult in ListenPLCEnumerator(cts.Token))
{
Console.WriteLine($"{plcResult} PLC 수신");
// 10개만 처리하고 종료
count++;
if (count == 10)
cts.Cancel();
}
static async IAsyncEnumerable<PLCResult> ListenPLCEnumerator([EnumeratorCancellation] CancellationToken ct)
{
while (ct.IsCancellationRequested is false)
{
var number = Random.Shared.Next(100, 500);
await Task.Delay(number);
yield return new PLCResult(number);
}
}
record PLCResult(int number);
비동기 스트림을 사용해서 ListenPLCEnumerator에서 PLC의 값을 수신했을 때 그것을 await foreach문을 통해 처리할 수 있게 됩니다.
(예시 코드에서는 처리시간 및 PLC 정보를 임의의 난수로 처리하여 시뮬레이션 했습니다)
| 결과
PLCResult { number = 164 } PLC 수신
PLCResult { number = 228 } PLC 수신
PLCResult { number = 266 } PLC 수신
PLCResult { number = 494 } PLC 수신
PLCResult { number = 309 } PLC 수신
PLCResult { number = 131 } PLC 수신
PLCResult { number = 193 } PLC 수신
PLCResult { number = 187 } PLC 수신
PLCResult { number = 192 } PLC 수신
PLCResult { number = 287 } PLC 수신