Reactive Extensions は、さまざまな演算子を何回評価することになっていますか?
次のテストコードがあります。
var seconds = Observable
.Interval(TimeSpan.FromSeconds(5))
.Do(_ => Console.WriteLine("{0} Generated Data", DateTime.Now.ToLongTimeString()));
var split = seconds
.Do(_ => Console.WriteLine("{0} Split/Branch received Data", DateTime.Now.ToLongTimeString()));
var merged = seconds
.Merge(split)
.Do(_ => Console.WriteLine("{0} Received Merged data", DateTime.Now.ToLongTimeString()));
var pipeline = merged.Subscribe();
これにより、5 秒ごとに「生成されたデータ」が書き込まれることを期待しています。次に、そのデータを「Split/Branch received Data」を書き込む「split」ストリームと「Received Merged data」を書き込む「merged」ストリームの両方に渡します。最後に、「結合された」ストリームは「分割された」ストリームからも受信しているため、データを 2 回受信し、「結合された受信データ」を 2 回書き込みます。(それらのいくつかを書く順序は特に関係ありません)
しかし、私が得ている出力は次のとおりです。
8:29:56 AM Generated Data
8:29:56 AM Generated Data
8:29:56 AM Split/Branch received Data
8:29:56 AM Received Merged data
8:29:56 AM Received Merged data
8:30:01 AM Generated Data
8:30:01 AM Generated Data
8:30:01 AM Split/Branch received Data
8:30:01 AM Received Merged data
8:30:01 AM Received Merged data
「生成されたデータ」を2回書き込んでいます。私の理解では、「seconds」IObservable にサブスクライブされているダウンストリーム オブザーバーの数は、「Generated Data」が書き込む回数 (ONCE である必要があります) には影響しませんが、影響します。なんで?
注: .Net Framework 3.5 環境でリアクティブ拡張機能の安定版リリース v1.0 SP1 を使用しています。