日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。前回盛大に間違えてid:neueccさんに指摘していただいたホットなObservableですが、教えてもらった内容を踏まえて自分なりに書いてみました。間違ってる理解の可能性があるので注意深く読んでください!ColdなIObservableとHotなIObservableこれまでに紹介したIObservableのファクトリメソッドは全て共通の特徴があります。それは複数回Subscribeすると、それぞれのIObserverにIObservableが個別に値を発行します。IObservableの作り方にもよりますが、基本的には同じ値が発行されていきます。文章で説明するよりもコードの動作例で示します。Console.WriteLine("2##Completed()"));Console.ReadLine();subscription1.Dispose();subscription2.Dispose();上記のコードは1秒間隔で値を発行するIObservableを作成し、1回Subscribeしたあとに3秒待ってもう一度Subscribeしています。この実行結果を下記に示します。1##OnNext(値)の形式で出力しています。2##OnNext(値)の形式で出力しています。これを見ると、最初にSubscribeしたものと二回目にSubscribeしたものでは、タイムスタンプが微妙にずれていることから、内部的には別のタイマーが割り当てられていることが見て取れます。発行される値もSubscribeした時点で0からカウントされていて最初にSubscribeしたものと二回目にSubscribeしたものの間に関係性は全くありません。このように、ColdなObservableは「複数回Subscribeした時にObserverごとに発行する値のシーケンスから値を発行する」という特徴があります。次に、Coldと対となるものとしてHotなIObservableを見ていきます。HotなObservableの代表として.NET組み込みのObserverパターンであるイベントからIObservableを生成するObservable.FromEvent(...)というメソッドがあります。このメソッドのシグネチャを下記に示します。Action<TEventArgs>はSubscribeしたときのOnNextの処理にあたる。removeHandler)今まで出てきたもののなかではかなり異質の引数ですがイベントハンドラの形にあったデリゲートを作成してハンドラの登録処理と削除処理を渡します。あとはIObservableをSubscribeしたタイミングやDisposeしたタイミングで適切にイベントの登録・登録解除が行われます。自前でやるとイベントハンドラの登録解除は忘れがちな処理なので地味に有りがたい機能です。コード例を下記に示します。Console.WriteLine("2##Completed()"));Console.ReadLine();subscription1.Dispose();subscription2.Dispose();timer.Stop();ColdなObservableで示した処理と基本的には同じ処理を行っています。実行結果を下記に示します。23:37:46.216)上記の結果で興味深い点は、最初にSubscribeしたものと、二番目にSubscribeしたものの出力結果のタイムスタンプと、OnNextに渡ってきている値が同じという点です。HotなIObservableとはColdなIObservableと違って同じ値を同時にIObserverに通知するものということになります。次回からは、HotなIObservableを作成するメソッドをいくつか確認していこうと思います。Extensions再入門とは関係ありません。C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。Blogの内容は個人の見解であり、所属する企業を代表するものではありません。)はてなブログをはじめよう!okazukiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。