IObservable ]的SynchronousBuffer扩展方法 ] 我需要一个不能按时或在特定条件下进行缓冲的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 缓冲区的快照,但是应该...

问题描述 投票:0回答:2
]

我需要一个不能按时或在特定条件下进行缓冲的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 缓冲区的快照,但是应该...

c# system.reactive
2个回答
0
投票

如果您正在寻找一种反应性解决方案,那么将输入建模为可观察对象总是更容易。在这种情况下:

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();

0
投票

另一种方法是尝试定义一个您认为更改是同步的时间窗口:

© www.soinside.com 2019 - 2024. All rights reserved.