Rx の主要なインターフェイスの探索

このトピックでは、監視可能なシーケンスを表し、それらをサブスクライブするために使用される主要なリアクティブ拡張 (Rx) インターフェイスについて説明します。

IObservable<T>/IObserver<T> インターフェイスは、.NET Framework 4.0 基本クラス ライブラリで使用でき、.NET 3.5、Silverlight 3、4、および Javascript にインストールできるパッケージに含まれています。

IObservable<T>/IObserver<T>

Rx は、非同期データ ソースとイベント ベースのデータ ソースを、.NET Framework 4.0 の新しい IObservable T> インターフェイスによって抽象化されたプッシュベースの監視可能な<シーケンスとして公開します。 この IObservable<T> インターフェイスは、プルベースの列挙可能なコレクションに使用される使い慣れた IEnumerable<T> インターフェイスのデュアルです。 これは、観察できるデータ ソースを表します。つまり、関心のあるすべてのユーザーにデータを送信できます。 このような関心のあるリスナーを表す依存 IObserver<T> 実装の一覧を保持し、状態の変更を自動的に通知します。

IObservable<T インターフェイスの実装は、T> 型の要素のコレクションと見なすことができます。したがって、IObservable<int> は整数のコレクションとして表示でき、整数はサブスクライブされたオブザーバーにプッシュされます。

Rx とは」で説明されているように、プッシュ モデルの残りの半分は、サブスクリプションを通じて関心を登録するオブザーバーを表す IObserver<T> インターフェイスによって表されます。 その後、アイテムは、サブスクライブ先の監視可能なシーケンスからオブザーバーに渡されます。

監視可能なコレクションから通知を受信するには、IObservable の Subscribe メソッドを使用して IObserver<T> オブジェクトを渡します。 このオブザーバーの代わりに、Subscribe メソッドは、サブスクリプションのハンドルとして機能する IDisposable オブジェクトを返します。 これにより、完了後にサブスクリプションをクリーンできます。  このオブジェクトで Dispose を呼び出すと、オブザーバーがソースからデタッチされ、通知が配信されなくなります。 推測できるように、Rx では、.NET イベント モデルのようにイベントを明示的にサブスクライブ解除する必要はありません。

オブザーバーは、インターフェイスのメソッドによって反映される 3 つのパブリケーション イベントをサポートします。 監視可能なデータ ソースに使用可能なデータがある場合、OnNext は 0 回以上呼び出すことができます。 たとえば、マウスの移動イベントに使用される監視可能なデータ ソースは、マウスが移動するたびに Point オブジェクトを送信できます。 他の 2 つのメソッドは、完了またはエラーを示すために使用されます。

IObservable<T/IObserver<T>> インターフェイスの一覧を次に示します。

public interface IObservable<out T> 
{ 
   IDisposable Subscribe(IObserver<T> observer); 
} 
public interface IObserver<in T> 
{ 
   void OnCompleted();            // Notifies the observer that the source has finished sending messages.
   void OnError(Exception error); // Notifies the observer about any exception or error.
   void OnNext(T value);          // Pushes the next data value from the source to the observer.
} 

Rx には、IObserver<T> インターフェイスを自分で実装しないようにするための Subscribe 拡張メソッドも用意されています。 監視可能なシーケンスのパブリケーション イベント (OnNext、OnError、OnCompleted) ごとに、次の例に示すように、呼び出されるデリゲートを指定できます。 イベントのアクションを指定しない場合、既定の動作が発生します。

IObservable<int> source = Observable.Range(1, 5); //creates an observable sequence of 5 integers, starting from 1
IDisposable subscription = source.Subscribe(
                            x => Console.WriteLine("OnNext: {0}", x), //prints out the value being pushed
                            ex => Console.WriteLine("OnError: {0}", ex.Message),
                            () => Console.WriteLine("OnCompleted"));

監視可能なシーケンス (マウス オーバー イベントのシーケンスなど) は、通常のコレクションであるかのように扱うことができます。 したがって、コレクションに対して LINQ クエリを記述して、フィルター処理、グループ化、作成などを行うことができます。観測可能なシーケンスをより便利にするために、Rx アセンブリには多くのファクトリ LINQ 演算子が用意されているため、これらを単独で実装する必要はありません。 これについては、 LINQ 演算子を使用した監視可能シーケンスのクエリに関する トピックで説明します。

警告

IObservable<T/IObserver<T>> インターフェイスを自分で実装する必要はありません。 Rx は、これらのインターフェイスの内部実装を提供し、 Observable 型と Observer 型によって提供されるさまざまな拡張メソッドを通じてそれらを公開します。 詳細については、 監視可能シーケンスの作成とクエリに関する トピックを参照してください。

参照

概念

LINQ 演算子を使用した監視可能シーケンスのクエリ

その他の参照情報

監視可能シーケンスの作成とクエリ