我需要一个不能按时或在特定条件下进行缓冲的Buffer方法。它的行为应类似于此快照方法:
Taking a snapshot of ReplaySubject<T> buffer
但是不应该拍摄单个快照,当同步更改发生时,它应该缓冲,并提供IObservable
我认为应该有一个几乎简单的解决方案作为此Snapshot方法,但我无法直面如何真正解决此问题。 (注意:快照方法也可以用于多个主题的查询)
这里是一种测试方法:
[TestMethod] public async Task SyncBufferTest() { var i1 = new BehaviorSubject<int>(1); var i2 = new BehaviorSubject<int>(4); var sum = i1.CombineLatest(i2, (i1Value, i2Value) => i1Value + i2Value); var listAsync = sum.SynchronousBuffer().Select(buf => buf.Last()).ToList().RunAsync(new CancellationToken()); Action syncChange1 = () => { i1.OnNext(2); i2.OnNext(5); i1.OnNext(7); }; Action syncChange2 = () => { i1.OnNext(1); i2.OnNext(1); }; Action syncChange3 = () => { i1.OnNext(3); i1.OnCompleted(); i2.OnCompleted(); }; Task.Run(syncChange1) .ContinueWith(t => syncChange2()) .ContinueWith(t => syncChange3()); var list = await listAsync; CollectionAssert.AreEqual(new List<int> { 5, 12, 2, 4 }, list.ToList()); }
背景:
我正在研究一个以反应性数据层作为应用程序基础的体系结构概念。整个数据层包含主题(作为“交谈”数据层)。在一次交易中,将更改多个这些主题。我在应用程序的较高层中有许多可观察对象,它们是对多个主题的查询。因此,我需要此SynchronousBuffer来处理所有这些查询中所有这些主题的同步更改,以免多次通知。
我需要一个不能按时或在特定条件下进行缓冲的Buffer方法。它的行为应类似于以下快照方法:拍摄ReplaySubject
如果您正在寻找一种反应性解决方案,那么将输入建模为可观察对象总是更容易。在这种情况下:
var i1 = new BehaviorSubject<int>(1);
var i2 = new BehaviorSubject<int>(4);
var sum = i1.CombineLatest(i2, (i1Value, i2Value) => i1Value + i2Value);
Action syncChange1 = () =>
{
i1.OnNext(2);
i2.OnNext(5);
i1.OnNext(7);
};
Action syncChange2 = () =>
{
i1.OnNext(1);
i2.OnNext(1);
};
Action syncChange3 = () =>
{
i1.OnNext(3);
i1.OnCompleted();
i2.OnCompleted();
};
IObservable<Action> actions = new Action[] { syncChange1, syncChange2, syncChange3 }.ToObservable();
另一种方法是尝试定义一个您认为更改是同步的时间窗口: