IDisposable的正确实施可用于清理Rx观察器和长寿命观察器



我正在使用IDisposableCompositeDisposable来清理ViewModels中的反应扩展(Rx)观测器。

在这个场景中,我的ViewModels中IDisposable的正确实现是什么?通常,我不会实现终结器,因为没有非托管对象,但终结器似乎有助于捕获对Dispose的任何遗漏调用,从而确保始终释放我的Observer。(My Observable是在应用程序的生命周期内实例化的,而ViewModels则不是。)

谢谢!

更新:

一些澄清:在这种情况下,调用Dispose的必要性有点不同。Reactive Extensions中的Observer使用Dispose来取消对Observable的订阅。在我的情况下,我有一个具有许多短命观察者的长期观察者,因此观察者不会是GC,除非由于Observable->Observer引用而被明确处理。我对反应式扩展完全陌生,所以我的理解可能有误。

您不应该使用终结器在其他托管对象上调用Dispose()(或任何方法)。这些对象可能已经定稿(因为无法保证定稿的顺序:http://msdn.microsoft.com/en-us/library/system.object.finalize(v=vs.100).aspx

由于这些对象本身是IDisposable的,因此如果没有对它们调用Dispose()(假设它们实现正确),那么它们的终结器(如果它们有终结器的话)将负责需要完成的任何工作。

您不需要处置Rx IDisposables,除非您明确希望提前取消订阅。只要把它们泄露出去。它们不代表非托管内存,因此CLR将像其他任何对象一样对它们进行GC。也永远不要在这些对象上实现终结器。

您也不必担心引用循环,CLR的GC足够聪明,可以检测到它们(就像您有someA.B = someB; and someB.A = someA一样)

您不应该使用终结器来调用Dispose()以取消订阅Rx订阅。终结器只有在对象即将被垃圾回收时才会被调用,而垃圾回收只有在对象不再能够被引用时才会发生。如果有当前订阅,那么它就有引用,不会被垃圾回收。

您必须自己显式地调用.Dispose()才能清理订阅。

最新更新