我的项目中有很多代码,例如点击和静音,通过这种方式使用无效扩展:
IDisposable dsp = null;
dsp = TargetObservable.Subscribe((incomingContent) =>
{
if (incomingContent == "something")
{
myList.Add(incomingContent);
dsp.Dispose();
}
});
首先,我担心线程的安全性,因为我的Observable非常繁忙并且有很多内容一直在推动,但后来,我被告知我应该与ObserveOn(thread)
结合以保证线程安全,我完全同意,所以让我们忘记线程安全的事情。
我想知道:
Take(count)
,'TakeWhile(预测)'?OnComplete()
被调用,Dispose()
将在内部调用,对吗?然后Observer和Observable之间的引用关系将中断(因为我的observable是一个长寿命的静态实例,引用会导致内存泄漏)。答案 0 :(得分:8)
我会避免遵循你在这里的模式。如果其他开发人员必须将全局状态与subscribe / OnNext处理程序的内部函数混合,则很难理解问题空间。
您最好创建封装序列终止的TakeWhile
/ TakeUntilIncluding
扩展方法。然后,您可以将“添加到列表”的问题分开。
另一个要做的事情就是超级简单:
var subscription = source.Where(x => x=="something")
.Take(1)
.Subscribe(incomingContent=>myList.Add(incomingContent));