ReactiveUI是否泄漏订阅?

Dam*_*ian 7 system.reactive reactiveui

我从博客中查看了ReactiveUi的示例,我想知道ReactiveUI是否在下面有某种订阅管理工具,或者是忽略了它们可能泄漏订阅这一事实的例子?

每当我在ReactiveUi中调用一个导致a的方法时IDisposable,我是否需要保留该引用并自己跟踪它?这也意味着我的ViewModel需要是一次性的,这似乎很难,因为我们不知道什么时候连接的"视图"消失了(即如果我的ViewModel反映了数据网格中的项目),所以似乎没有合适的叫做处置的地方.

Ana*_*tts 14

您还必须记住,Rx和ReactiveUI返回的IDisposable与非托管内存无关 - 它只是简单的.NET对象,仍由垃圾收集器引用.

您在ReactiveObjects的构造函数中创建的大多数订阅都将绑定到宿主对象的生命周期 - 因此当它超出范围并受GC影响时,所有订阅也将如此,CLR将检测循环引用和只是把一切都搞定了.

正如Enigmativity所提到的,一个棘手的问题是当您使用FromEventPattern将订阅的生命周期(可能是ViewModel)与WPF对象的生命周期联系起来时.但是,我认为如果你经常在ReactiveUI中使用FromEventPattern,那么你肯定是在做错了.

RxUI是关于ViewModels的,而ViewModel都是关于命令属性的(并且将属性相互关联的方式联系起来),因此您可以与其视觉效果分开测试用户体验的行为.


Eni*_*ity 11

IDisposable如果您需要从可观察对象中提前取消订阅,则只需要保留对订阅返回的引用.Observable自然会Dispose在它们通过OnCompletedOnError消息终止时调用.

但是,当您具有无限可观察订阅(即FromEventPattern)时,您需要保留引用,但这与在关闭表单/视图之前需要删除事件处理程序完全相同.