管理人の技術ブログです。HotとColdRxIObservable<T>には、HotとColdと呼ばれる2つの性質があります。実はこれまで触れてきた記事のサンプルにもHotなものとColdなものが出てきていました。これらの性質の違いを把握することはRxを利用する上で非常に重要です。今回はこれらについて見ていきます。Observableと呼ばれる性質についてです。Hotな性質とは、同一のIObservable<T>シーケンスに関連付けたすべてのIObserver<T>に対して一度に同じ値を通知することを言います。Hotな性質を持つものの代表はイベント関連です。以下にObservable.FromEventメソッドを利用したサンプルを示します。イベントのシーケンス化のサンプルでも挙げた、キー入力が行われる度にKeyPressイベントを発行するだけの簡単なクラスを作成します。Qが押下されたらループを抜けるようになっています。}}次に、上で作成した型のKeyPressイベントをIObservable<T>シーケンス化したものに対して、オブザーバーAだけを関連付けた場合とオブザーバーAとBを関連付けた場合の挙動を確認します。Q」と入力しています。オブザーバーA、Bの両方を接続している場合に注目すると、キー押下時に同時に両方のOnNext処理が反応しています。オブザーバーAだけを接続している場合は言わずもがなです。Observableになります。イメージとしては、イベントの発生をそのまま待機しているという感じです。Observableと呼ばれる性質についてです。Coldな性質とは、IObservable<T>シーケンスに関連付けたそれぞれのIObserver<T>に対して個別に値を通知することを言います。例外はあるものの、ColdなものはSubscribeメソッドが呼び出されると同時に値を発行するものが多いです。代表的なファクトリーメソッドには、Observable.ReturnメソッドやObservable.Rangeメソッドなどがあります。以下にそのサンプルを示します。-----*/上記のサンプルでは同一の変数に対してSubscribeしていますが、関連付けを行ったそれぞれのオブザーバーに対して即座にすべての値が送信されています。Observableと違い、シーケンスに対してオブザーバーBの接続を追加してもオブザーバーAに値が発行されることはありません。Observable.Timerメソッドは「一定時間ごとに値を通知するイベント」のようなものなのでHotのように思いますが、実はColdです。時間のシーケンス化で紹介したObservable.Timerメソッドのサンプルを再掲します。OnNext(5)*/Observable.Timerメソッドから返されたシーケンスを複数回の購読する場合の動きに注目してください。結果より、AのタイマーもBのタイマーも値が0から始まっていることが確認できます。これは、Subscribeメソッド呼び出し時にObservable.Timerの内部でタイマーが2つ生成されていることを示しています。タイマーAとタイマーBは相互に関係がなく、それぞれ個別に値が発行されていることがわかります。両方の性質を持つもの中にはHotとColdの両方の性質を持つものもあります。AsyncSubject<T>やObservable.ToAsyncメソッドなどの非同期系のものは、その代表です。以下にAsyncSubject<T>を利用したサンプルを示します。-----*/AsyncSubject<T>は、OnCompletedメソッドが呼び出されるまでが非同期処理中を表します。同じ値が通知されます。シーケンスへの接続が行われた場合は、その都度戻り値と完了通知が送信されます。サンプルではオブザーバーCとオブザーバーDが該当します。Observableとなります。このように、状態に応じて性質が変わるものが存在することを覚えておきましょう。よるものと配列やリストによるものに性質の違いがあります。以下にそのサンプルを示します。ついては、以下も合わせてお読みください。後者の@neueccさんの記事にはSilverlightを利用したサンプルが付いているので、より理解が深まると思います。今回はIObservable<T>の重要な性質であるHotとColdについて見てきました。Push型とPull型で書きましたが、今回確認した通りColdなObservableでは分配ができません。「それじゃ困る!」ということでColdなObservableををHotなObservableに変換する機能が用意されています。Hot変換について触れてみたいと思います。(1)月別アーカイブはてなブログをはじめよう!xin9leさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。