1

我正在使用IDisposablewithCompositeDisposable来清理我的 ViewModels 中的 Reactive Extension (Rx) Observers。

IDisposable在这种情况下,我的 ViewModel 中的正确实现是什么?通常,我不会实现终结器,因为没有非托管对象,但似乎终结器可能有助于捕获任何未接来电Dispose,从而确保始终释放我的观察者。(我的 Observable 在应用程序的整个生命周期内都会被实例化,而 ViewModel 则不会。)

谢谢!

更新:

一些澄清:在这种情况下,调用 Dispose 的需求略有不同。Reactive Extensions 中的 Observer 使用 Dispose 取消订阅 Observable。就我而言,我有一个长寿命的观察者和许多短寿命的观察者,因此观察者不会是 GC,除非由于 Observable->Observer 引用而显式处置。我对 Reactive Extensions 完全陌生,所以我的理解可能有误。

4

3 回答 3

1

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

您必须明确地调用您.Dispose()自己,以便清理您的订阅。

于 2012-08-23T01:55:54.673 回答
1

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

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

于 2012-08-22T16:41:00.840 回答
1

您不需要 Dispose Rx IDisposables,除非您明确想要提前取消订阅。只是泄漏它们。它们不代表非托管内存,因此 CLR 将像任何其他对象一样对它们进行 GC。并且永远不要在这些对象上实现终结器。

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

于 2012-08-22T20:14:07.850 回答