【发布时间】:2015-02-24 20:12:25
【问题描述】:
所以也许我把这个观察者模式弄错了,但这就是我想要的。我有一种方法应该从数据库中获取一些整数。看起来像这样:
IObservable<int> GetInts()
每次他得到一个整数时,他自然应该通过 OnNext() 告诉它的订阅者。但是,如果观察员迟到,他可能会错过其中一些电话。我仍然希望他知道所有信息,所以当他订阅 Observable 时应该“填写”并告诉他他错过的信息......然后在添加新内容时继续告诉他。
但是,在某些时候,数据库读取将结束,并且该方法会知道这一点。此时,他应该调用订阅者的 OnComplete()。所以基本上我想要的是一个向人们讲述一些东西的集合。我还没有找到可以做这样的事情的东西,所以我必须实现它。它可能看起来像:
class MyObservable:List<int>,IObservable<int>{
private bool completed;
private List<IObserver<int>> observers = new List<IObserver<int>>();
public bool Completed{
get{return completed;}
set{
completed = value;
if(completed == true){
observers.ForEach(obs=>obs.OnCompleted());
}
}
}
public IDisposable Subscribe(IObserver<int> obs){
observers.Add(obs);
this.ForEach(n => obs.OnNext(n));
if(Completed) obs.OnCompleted();
return Disposable.Create(()=>observers.Remove(obs));
}
public void Add(int n){
observers.ForEach(obs => obs.OnNext(n));
base.Add(n);
}
}
有没有更好的方法来做到这一点?像这样的东西已经在 Rx 中实现了?或者,如果我根本不应该这样做,我最好的选择是什么?
如果这是要走的路,我应该担心什么样的事情? (例如并发..等)。
【问题讨论】:
-
这是使用 Rx 时的一般规则 - 如果您发现自己实现了
IObservable<T>或IObserver<T>,那么您做错了什么。您应该始终使用内置的 Rx 对象和运算符。永远不要自己滚动。它充满了危险。
标签: c# asynchronous observablecollection system.reactive