.NET 이벤트 외에도 다른 비동기 데이터 원본이 .NET Framework 있습니다. 그 중 하나는 비동기 메서드 패턴입니다. 이 디자인 패턴에서는 두 가지 메서드가 제공됩니다. 한 메서드(일반적으로 BeginX)는 계산을 시작하고 두 번째 메서드(일반적으로 EndX)에 전달된 IAsyncResult 핸들을 반환한 다음 계산 결과를 검색하는 데 사용됩니다. 완료는 일반적으로 AsyncCallback 대리자를 구현하거나 IAsyncResult.IsCompleted를 폴링하여 신호를 받습니다. 이 패턴을 준수하는 코드는 읽기 및 유지 관리가 어려운 경우가 많습니다. 이 항목에서는 Rx 팩터리 메서드를 사용하여 이러한 비동기 데이터 원본을 관찰 가능한 시퀀스로 변환하는 방법을 보여 줍니다.
비동기 패턴을 관찰 가능한 시퀀스로 변환
.NET의 많은 비동기 메서드는 BeginX 및 EndX와 같은 서명으로 작성됩니다. 여기서 X는 비동기적으로 실행되는 메서드 이름입니다. BeginX는 인수를 사용하여 메서드를 실행합니다. AsyncCallback은 IAsyncResult를 사용하고 아무 것도 반환하지 않으며 마지막으로 개체 상태를 반환하는 작업입니다. EndX는 AsyncCallback에서 전달되는 IAsyncResult를 사용하여 비동기 호출의 값을 검색합니다.
Observable 형식의 FromAsyncPattern 연산자는 Begin 및 End 메서드(연산자에 매개 변수로 전달됨)를 래핑하고 Begin과 동일한 매개 변수를 사용하고 관찰 가능한 을 반환하는 함수를 반환합니다. 이 관찰 가능 항목은 방금 지정한 호출의 비동기 결과인 단일 값을 게시하는 시퀀스를 나타냅니다.
다음 예제에서는 IAsyncResult 패턴을 사용하는 Stream 개체에 대해 BeginRead 및 EndRead를 관찰 가능한 시퀀스를 반환하는 함수로 변환합니다. FromAsyncPattern 연산자의 제네릭 매개 변수의 경우 콜백까지 BeginRead 인수의 형식을 지정합니다. EndRead 메서드는 값을 반환하므로 이 형식을 FromAsyncPattern의 최종 제네릭 매개 변수로 추가합니다. 에 마우스를 read가져가 var 면 FromAsyncPattern의 반환 값이 시그니처가 있는 함수 대리자임을 알 수 있습니다. 즉, Func<byte[], int32,int32, IObservable<int32>>이 함수는 3개 매개 변수(BeginRead에 대해 동일한 매개 변수)를 사용하고 IObservable<Int32>를 반환합니다. 이 IObservable에는 EndRead에서 반환된 정수인 하나의 값이 포함되며 스트림에서 읽은 바이트 수(0)와 요청한 바이트 수 사이의 바이트 수가 포함됩니다. 이제 IAsyncResult 대신 IObservable이 제공되므로 Observables에 사용할 수 있는 모든 LINQ 연산자를 사용하고 구독, 구문 분석 또는 작성할 수 있습니다.
Stream inputStream = Console.OpenStandardInput();
var read = Observable.FromAsyncPattern<byte[], int, int, int>(inputStream.BeginRead, inputStream.EndRead);
byte[] someBytes = new byte[10];
IObservable<int> source = read(someBytes, 0, 10);
IDisposable subscription = source.Subscribe(
x => Console.WriteLine("OnNext: {0}", x),
ex => Console.WriteLine("OnError: {0}", ex.Message),
() => Console.WriteLine("OnCompleted"));
Console.ReadKey();