使用响应式扩展来监控IEnumerable



我连接到一个对象,异步加载对象的集合到IEnumerable。在我连接时,IEnumerable的集合中可能已经有项目,并且可能在应用程序的生命周期内添加项目,我需要在它们出现时得到通知。例如,它可以是一个包含银行交易列表的银行帐户。

挑战是这样的。我想将IEnumerable中初始值的处理与任何新添加的处理结合起来。它们目前是两个进程。我想完全消除NotifyCollectionChanged的使用。

可以修改保存IEnumerable的后端。如果存在解决此问题的方法,则不需要保留为IEnumerable。

我建议对象不应该暴露IEnumerable,因为这是"冷可观察值",在你的情况下,你需要的东西可以在未来获得额外的项目也。

最好的建模方法是使用ReplaySubject<T>代替IEnumerable。下面是一个与你的情况类似的例子:

//Function to generate the subject with future values
public static ReplaySubject<int> GetSubject()
{
    var r = new ReplaySubject<int>();
    r.OnNext(1); r.OnNext(2); r.OnNext(3);
    //Task to generate future values
    Task.Factory.StartNew(() =>
    {
        while (true)
        {
            Thread.Sleep(3000);
            r.OnNext(DateTime.Now.Second);
        }
    });
    return r;
}
消费代码:

var sub = GetSubject();
sub.Subscribe(Console.WriteLine);

每次订阅sub,都将获得该主题迄今为止发布的所有值以及该主题将来产生的新值

您可以使用延迟/重放操作符

相关内容

  • 没有找到相关文章

最新更新