かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Reactive Extensions入門 14 「OKが出るまで待つ」

さて、Reactive ExtensionsのIObservableには、Publishというメソッドがあります。このメソッドは、IObservableが通知する値を塞き止めるような効果があります。
Publishメソッドが返すのは、IConnectableObservableという型で、こいつのConnectメソッドを呼ぶと、もとになったIObservableが発行してきた値を通過させてくれます。

早速試してみましょう。

namespace PublishSample
{
    using System;
    using System.Collections.Generic;
    using System.Linq;

    class Program
    {
        static void Main(string[] args)
        {
            var subject = new Subject<int>();
            IConnectableObservable<int> ob = subject.Publish();

            // IConnectableObservable<int>をサブスクライブするぜ
            ob.Subscribe(Console.WriteLine);
            ob.Sum().Subscribe(i => Console.WriteLine("合計 : {0}", i));

            // Connect前にいくら通知してもSubscribeしたところには届かない
            subject.OnNext(1);
            subject.OnNext(2);
            subject.OnNext(3);

            // 接続!!
            ob.Connect();

            // Connectしたら値がSubscribeしたところまで届く
            subject.OnNext(11);
            subject.OnNext(12);
            subject.OnNext(13);
            subject.OnCompleted();
        }
    }
}

実行すると、以下のようになります。

11
12
13
合計 : 36

以上、簡単ですがPublishメソッドの使い方でした。