4

IObservable があります。プロパティの変更には、エンティティ ID と PropertyName があります。これを使用してデータベースを更新したいのですが、複数のプロパティがほぼ同時に変更された場合、同じエンティティのすべてのプロパティに対して 1 つの更新のみを実行したいと考えています。

これが静的な IEnumerable で、LINQ を使用していた場合は、次のように簡単に使用できます。

MyList.GroupBy(C=>C.EntityID);

ただし、リストが終了することはありません (決して IObserver.OnComplete を呼び出しません)。私ができるようにしたいのは、一定時間、たとえば 1 秒間待機し、その 1 秒間にすべての呼び出しを適切にグループ化することです。

理想的には、EntityID ごとに個別のカウンターを用意し、その EntityID の新しいプロパティの変更が検出されるたびにカウンターをリセットします。

すべてのプロパティの変更を処理したいので、Throttle のようなものは使用できません。それらをまとめて一度に処理したいだけです。

4

2 に答える 2

8

どうぞ:

MyObservable
    .Buffer(TimeSpan.FromSeconds(1.0))
    .Select(MyList =>
        MyList.GroupBy(C=>C.EntityID));
于 2011-08-06T04:13:03.503 に答える
2

Bufferメソッドは、あなたが望むことをしているようです。TimeSpan を指定すると、すべてのメッセージがリストに折りたたまれます。同様のことを行うWindowメソッドもありますが、そのセマンティクスが何であるかは完全にはわかりません。

于 2011-08-05T23:39:04.607 に答える