我建议该对象不应该公开 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
都会得到该主题迄今为止发布的所有值,以及该主题未来产生的新值