我的项目中有很多代码,例如使用反应式扩展的命中和静音,如下所示:
IDisposable dsp = null;
dsp = TargetObservable.Subscribe((incomingContent) =>
{
if (incomingContent == "something")
{
myList.Add(incomingContent);
dsp.Dispose();
}
});
首先,我担心线程安全,因为我的 Observable 非常忙并且一直有一堆内容推送,但后来,我被告知我应该与ObserveOn(thread)
结合使用以保证线程安全,我完全同意,所以让我们忘记线程安全的事情。
在这里我想知道:
- 我应该如何或何时调用可观察的处置。
- 满足命中和静音的正确方法是什么,结合一些完整的扩展方法,如
Take(count)
,"TakeWhile(预测)"? - 如果调用
OnComplete()
,Dispose()
将在内部调用,对吗?然后观察者和可观察对象之间的引用关系将中断(因为我的可观察对象是一个长寿命的静态实例,引用会导致内存泄漏)。
我会避免遵循你在这里的模式。如果其他开发人员必须将全局状态与订阅/OnNext 处理程序的内部函数混合在一起,则很难理解问题空间。
最好创建封装序列终止的 TakeWhile
/TakeUntilIncluding
扩展方法。然后,您可以将"添加到列表"问题分开。
一个交替的事情是超级简单:
var subscription = source.Where(x => x=="something")
.Take(1)
.Subscribe(incomingContent=>myList.Add(incomingContent));