かずきのBlog@hatena

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

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