「マイクロソフト系技術情報 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 †
Muhammad Rehan Saeed †
Tags: :.NET開発