使用Reactive Extensions监视IEnumerable

时间:2011-09-01 19:34:35

标签: ienumerable system.reactive inotifycollectionchanged

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

挑战在于此。我想将IEnumerable中初始值的处理与任何新增加相结合。它们目前是两个过程。我想完全取消使用NotifyCollectionChanged。

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

2 个答案:

答案 0 :(得分:2)

我建议对象不应该公开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时,他们都会获得迄今为止在主题中发布的所有值以及此主题在将来生成的新值

答案 1 :(得分:0)

您可以使用延迟/重播运算符