我连接到一个对象,异步加载对象的集合到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
,都将获得该主题迄今为止发布的所有值以及该主题将来产生的新值
您可以使用延迟/重放操作符