「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次  †
概要  †
- Observer パターンを実装するフレームワークだが、
 
- 特に、LINQ to EventsもしくはLINQ to Asynchronusと表現できる。
 
- これは、要するに、
- イベントや非同期処理をLINQっぽく扱える。
 
- 非同期 / イベント / 時間に関する処理をLINQ的に簡潔かつ宣言的に記述できる。
 
 
と言うトコロを意味する。
経緯  †
- Silverlight Toolkitに"System.Reactive.dll"が同梱される。
 
- Reactive Framework ---> Reactive Extensionsと名称変更。
 
- DevLabs?(昔のMSコミュニティサイト)でプロジェクト公開
ソースコードは(恐らく)CodePlex?で公開されていた。 
- 何度もAPIの消滅・追加を繰り返す。
 
- JavaScript版が登場
 
- .NET Framework 4 SP1に標準搭載
 
- さまざまな開発言語に移植され、幅広く使われている。
 
ユースケース  †
Observer パターンの実装  †
LINQ(フィルタ、変換、集計、合成)  †
通知に対して、LINQ(フィルタ、変換、集計、合成)を適用できる。
イベントにObserver パターンを適用して、
LINQ(フィルタ、変換、集計、合成)を適用できる。
- イベントにObserver パターンを適用して、
LINQ(フィルタ、変換、集計、合成)を適用できる。 
- 具体的には、Observerを合成してネストを処理が可能。
 
詳細  †
Observer パターンで構成される。
Subscriber  †
IObserver<T>を実装したクラスを定義する。
Provider  †
- IObservable<T> を実装したクラスを定義する。
 
- クラスはラムダ式を使用したメソッドチェーンで実装できる。
 
開始  †
- Createなどの生成メソッドで生成、
| # | メソッド | 概要 | 
| 1 | Create | 監視内容を定義する。 | 
| 2 | Return | 渡した値を単純に通知する。 | 
| 3 | Range | 正指定した範囲の値を通知する。 | 
| 4 | Repeat | 第1引数で渡したデータを、 第2引数で指定した回数繰り返して通知する。 | 
| 5 | Generate | for 文的に以下を定義する。 ・初期値 ・継続判定デリゲート ・インクリメント・デリゲート ・通知する値を生成するデリゲート | 
| 6 | Case | 複数用意された IObservable の中から、どれか1つを選択。 ・IObservable配列 ・IObservable選択デリゲート | 
| 7 | Throw | 例外を通知する。 | 
| 8 | Start | 渡した値を非同期で通知する。 | 
| 9 | Defer | Providerのファクトリを実装。 | 
 
- Createで生成する場合、以下のメソッドを使用して監視内容を定義する。
| # | メソッド | 概要 | 
| 1 | OnNext? | 新しい値が発生したことを通知する。 | 
| 2 | OnError? | エラーが発生し、異常終了したことを通知する。 | 
| 3 | OnCompleted? | 正常に終了したことを通知する。 | 
 
- 必要に応じて、LINQメソッドを使用し通知内容を操作できる。
- Where(フィルタリング)
 
- Select(変換)
 
- Aggregate(集計)
 
- 合成
 
 
- Subscribeで、上記の其々のメソッドからの
Push(=通知、発行、イベント)を受け取るSubscriber?を設定する。 
終了  †
- ProviderがOnCompleted?を呼び出し、正常終了。
 
- ProviderがOnError?を呼び出し、異常終了。
 
- Subscriber?側でDisposeする。
 
分類  †
大きく分けて Hot / Cold に分類される。
- Cold
- Subscriber?とは1:1の関係
 
- Subscriber?が居なければ動作しない。
 
- 監視が終わった後はOnCompleted?で(自分で)終了する。
 
- Observable.Intervalなど例外もある。
 
 
- Hot
- Subscriber?とは1:nの関係
 
- Subscriber?がいなくても動作し続ける。
 
- 監視が終わったかどうかSubscriber?が判断してDispose。
 
 
Subject (Subscriber/Provider)  †
- IObserver<T>とIObservable<T>を実装したクラスを定義できる。
 
- Subjectを使用すれば、Subscriberをラムダ式で定義できる。
 
その他  †
合成  †
Providerの合成  †
値の合成  †
- Concat
 
- Zip
 
- Amb
 
- CombineLatest?
 
変換  †
イベント  †
- FromEvent? メソッドで、イベント・クラスを IObservable に変換できる。
 
- LINQメソッドを使用し通知内容を操作できる。
 
非同期  †
- FromAsyncPattern?メソッドでBeginInvoke?/EndInvoke? を IObservable に変換できる。
 
- LINQメソッドを使用し通知内容を操作できる。
- 具体的には、SelectMany? を組み合わせ、非同期のネストを簡単に記述できる。
 
 
ポイント  †
HotとColdの概念を掴む  †
Schedulerが実行スレッドを決定する  †
Subjectでテストする  †
参考  †
@IT  †
Build Insider  †
Qiita  †
- いまさら聞けないReactive Extensions
 
neue cc  †
xin9le.net  †
かずきのBlog@hatena  †
present  †
Reactive Extensions 入門
Muhammad Rehan Saeed  †
Reactive Extensions (Rx)
Tags: :.NET開発