Reactive Extensions

リアクティブ拡張機能 (Rx) は、監視可能なシーケンスと LINQ スタイルのクエリ演算子を使用して、非同期およびイベント ベースのプログラムを作成するためのライブラリです。

データ シーケンスは、ファイルまたは Web サービスからのデータ ストリーム、Web サービス要求、システム通知、ユーザー入力などの一連のイベントなど、多くの形式を取ることができます。

リアクティブ拡張は、これらすべてのデータ シーケンスを監視可能なシーケンスとして表します。 アプリケーションは、これらの監視可能なシーケンスをサブスクライブして、新しいデータが到着したときに非同期通知を受信できます。 Rx ライブラリは、.NET でのデスクトップ アプリケーション開発に使用できます。 Silverlight、Windows Phone 7、JavaScript でもリリースされています。 これらのさまざまなプラットフォームの詳細については、「 Rx のバージョン間の違い 」トピックを参照してください。

データのプルとプッシュ

対話型プログラミングでは、アプリケーションは、ソースを表すシーケンスからデータをプルすることで、データ ソースをアクティブにポーリングして詳細を確認します。 このような動作は、IEnumerable<T/IEnumerator<T>> の反復子パターンによって表されます。 IEnumerable<T インターフェイスは、このコレクションを反復処理するために IEnumerator T>> を返す単一のメソッド GetEnumerator<() を公開します。  IEnumerator<T> を使用すると、現在のアイテムを取得し (Current プロパティを返すことによって)、反復処理する項目が他にもあるかどうかを判断できます (MoveNext メソッドを呼び出します)。 

アプリケーションはデータ取得プロセスでアクティブです。GetEnumerator を呼び出して列挙子を取得するだけでなく、MoveNext を呼び出すことで取得のペースも制御します。 この列挙パターンは同期的です。つまり、データ ソースのポーリング中にアプリケーションがブロックされる可能性があります。 このような引っ張りパターンは、ライブラリにアクセスして本をチェックアウトするのと似ています。 本を使い終わったら、別の本をチェックするために別の訪問を行います。

一方、事後対応型プログラミングでは、アプリケーションはデータ ストリーム (Rx では監視可能なシーケンスと呼ばれます) をサブスクライブすることによってより多くの情報を提供され、ソースから更新が渡されます。 アプリケーションは、データ取得プロセスではパッシブです。監視可能なソースのサブスクライブとは別に、ソースをアクティブにポーリングするのではなく、プッシュされるデータに反応するだけです。 ストリームに提供するデータがなくなった場合、またはエラーが発生した場合、ソースはサブスクライバーに通知を送信します。 この方法では、ソースの更新を待機することでアプリケーションがブロックされることはありません。

これは、リアクティブ拡張機能によって採用されるプッシュ パターンです。 これは、特定のジャンルに興味を登録するブック クラブに参加するのと似ています。興味に合った書籍は、発行されると自動的に送信されます。 あなたが望むものを得るために並んで立つ必要はありません。 プッシュ パターンの使用は、多くのシナリオで役立ちます。特に、アプリケーションが一部のイベントを待機している間に UI スレッドをブロックできない UI が多い環境では役立ちます。 これは、独自の非同期要件のセットを持つ Silverlight などのプログラミング環境でも不可欠です。 まとめると、Rx を使用すると、アプリケーションの応答性を高めることができます。

Rx によって実装されるプッシュ モデルは、IObservable T/IObserver<T>> の監視可能な<パターンで表されます。 IObservable<T> インターフェイスは、使い慣れた IEnumerable<T> インターフェイスのデュアルです。 一連のデータを抽象化し、データ シーケンスに関心のある IObserver<T> 実装の一覧を保持します。 IObservable は、すべてのオブザーバーに状態の変更を自動的に通知します。 サブスクリプションを通じて関心を登録するには、IObservable の Subscribe メソッドを使用します。このメソッドは IObserver を受け取り、IDisposable を返します。 これにより、サブスクリプションを追跡および破棄できます。 さらに、Rx の監視可能なシーケンスに対する LINQ 実装を使用すると、開発者は、.NET イベント、APM ベース ("IAsyncResult") 計算、タスク<T> ベースの計算、Windows 7 センサーと場所 API、SQL StreamInsight テンポラル イベント ストリーム、F# ファースト クラス イベント、非同期ワークフローなどのプッシュ ベースのシーケンスに対して複雑なイベント処理クエリを作成できます。 IObservable<T/IObserver<T>> インターフェイスの詳細については、「Rx の主要なインターフェイスの探索」を参照してください。 Rx のさまざまな機能の使用に関するチュートリアルについては、「Rx の 使用」を参照してください。