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

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>