10

.Net 4.6 を使用する私の WPF アプリケーションでは、新しいデータ ポイントを高速 (毎秒数百) で起動するイベントがありますが、常にではありません。このデータはチャートに表示されます。

新しいデータ ポイントごとではなく、50 ミリ秒ごとにグラフを更新したいと思います。
それを達成するために、私はBuffer(TimeSpan.FromMilliseconds(50))Rxから使用することを考えましたが、理論的にはうまく機能します。しかし、新しいデータポイントが作成されない場合、サブスクライバーも50ミリ秒ごとに呼び出されますが、これはまさに私が望んでいるものではありません。

それをテストするために、小さなサンプル アプリケーションを作成しました。

using System;
using System.Reactive.Linq;

namespace RxTester
{
    public class Program
    {
        private static event EventHandler TheEvent;

        static void Main(string[] args)
        {
            var observable = Observable.FromEvent<EventHandler, EventArgs>(h => (s, e) => h(e), h => TheEvent += h, h => TheEvent -= h);
            var subscriber = observable.Buffer(TimeSpan.FromMilliseconds(1000))
                .Subscribe(e => Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: {e.Count} elements received..."));

            var random = new Random();
            var timer = new System.Timers.Timer(2000)
                {
                    AutoReset = true,
                    Enabled = true
                };
            timer.Elapsed += (s, e) =>
                {
                    var amount = random.Next(1, 10);
                    for (int i = 0; i < amount; ++i)
                        TheEvent?.Invoke(null, null);
                };

            Console.ReadLine();

            timer.Enabled = false;
            subscriber.Dispose();
        }
    }
}

次の Fiddle を実行または使用するには、「Rx-Linq」NuGet パッケージを追加する必要があります: https://dotnetfiddle.net/TV5tD4

そこには、いくつかの「0 要素を受け取りました」と表示されますが、これは避けたいことです。を簡単にチェックできることはわかってe.Count == 0いますが、そのようなバッファを複数使用しているため、これは最適ではないようです。

要素が利用可能な場合にのみ、要素の新しいバッファリングされたブロックを作成する方法はありますか?
私は、時間ベースでイベントをバッチ処理するという私の問題を解決するための他のアプローチにもオープンです - 私はすでに TPL Dataflows を調べましBatchBlockたが、カウントベースのブロックサイズしかサポートしていないようです。

4

2 に答える 2

3

これを行う標準的な方法は単純です

.Buffer(period)
.Where(buffer=>buffer.Any())

避けたいことを効果的に行う(count==0)。ただし、この小切手は非常に安価であり、関連する他のコスト、つまりスケジューリングよりもはるかに安いと思います。唯一の懸念事項は、発生している割り当て量 (50 ミリ秒ごとに を作成するList<T>) と、差し迫った GC Gen0 の圧力が高まる可能性があることです。

于 2016-02-25T01:04:04.133 に答える