IConnectableObservable の Connect の動作
以下、ふたつのプログラムは、Publishしたコールドソースのオブザーバブルに対して FirstAsync を複数回実行する。一方は毎回同じシーケンスを返し、他方はそれぞれ異なるシーケンスを返す。理屈がよく分からない。
using System; using System.Reactive.Linq; class Program { static void Main(string[] args) { System.Reactive.Subjects.IConnectableObservable<int> source = Observable.Range(0, 10).Publish(); source.FirstAsync(n => n % 3 == 0).Subscribe(Console.WriteLine); source.FirstAsync(n => n % 3 == 0).Subscribe(Console.WriteLine); source.FirstAsync(n => n % 3 == 0).Subscribe(Console.WriteLine); source.Connect(); Console.Read(); } }
出力
0
0
0
0
0
using System; using System.Reactive.Linq; class Program { public static System.Reactive.Subjects.IConnectableObservable<int> source; static void Main(string[] args) { source = Observable.Range(0, 10).Publish(); var sub = new Subscriber<int>(); source.Subscribe(sub); try { source.Connect(); } catch (InvalidOperationException) { } Console.Read(); } } class Subscriber<T> : IObserver<T> { void IObserver<T>.OnNext(T value) { Console.WriteLine(value); Program.source.FirstAsync(n => n % 3 == 0).Subscribe(m => Console.WriteLine("{0} <{1}>", value, m)); } void IObserver<T>.OnCompleted() { } void IObserver<T>.OnError(Exception error) { } }
出力
0
1
2
3
0 <3>
1 <3>
2 <3>
4
5
6
3 <6>
4 <6>
5 <6>
7
8
9
6 <9>
7 <9>
8 <9>
1
2
3
0 <3>
1 <3>
2 <3>
4
5
6
3 <6>
4 <6>
5 <6>
7
8
9
6 <9>
7 <9>
8 <9>