かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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メソッドの使い方でした。