かずきのBlog@hatena

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

Reactive Extensions入門 8「バッファリング」

さて、IObservableに対してWhereやSelectしてSubscribeするだけっていうのにも飽きてきたので、少し趣向を変えてみます。
今回紹介するのは、バッファリングするメソッドです。
以下のようなメソッドがあります。

  • BufferWithCount
  • BufferWithTime
  • BufferWithTimeOrCount

IObservableから上がってくる通知を、個数と、時間と、その両方でまとめあげてくれる動きをします。一番簡単なBufferWithCountを試してみたいと思います。

using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        var sb = new Subject<int>();

        // 2つずつに纏める
        sb.BufferWithCount(2).Subscribe(list =>
            {
                Console.WriteLine("----");
                list.Run(Console.WriteLine);
            });

        sb.OnNext(1);
        sb.OnNext(2);
        sb.OnNext(3);
        sb.OnNext(4);
    }
}

実行結果は以下のようになります。4つOnNextで通知したものが2つずつに纏められてるのがわかると思います。

----
1
2
----
3
4

ちなみに、BufferWithTimeは、TimeSpanのFrom〜メソッドを使って時間を指定してやります。

sb.BufferWithTime(TimeSpan.FromMilliseconds(1000))

Windowsアプリケーションのイベントや外部から通知される値を一定間隔溜めておいて処理するというのに使えそうです。