我正在使用 IDisposable
和 CompositeDisposable
来清理 ViewModel 中的响应式(Reactive)扩展 (Rx) 观察者。
在这种情况下,我的 ViewModel 中 IDisposable
的正确实现是什么?通常,我不会实现终结器,因为不存在非托管对象,但终结器似乎可以用于捕获任何对 Dispose
的错过调用,从而确保我的观察者始终被释放。 (我的 Observable 在应用程序的生命周期内实例化,而 ViewModel 则不然。)
谢谢!
更新:
一些澄清:在这种情况下,调用 Dispose 的需要略有不同。 Reactive Extensions 中的观察者使用 Dispose 来取消订阅 Observable。就我而言,我有一个长期观察者和许多短期观察者,因此观察者不会被GC,除非由于 Observable->Observer 引用而显式处置。我对响应式(Reactive)扩展完全陌生,所以我的理解可能是错误的。
最佳答案
您不应该使用终结器在其他托管对象上调用 Dispose() (或任何方法)。这些对象可能已经被最终确定(因为无法保证最终确定的顺序: http://msdn.microsoft.com/en-us/library/system.object.finalize(v=vs.100).aspx
由于这些对象本身是 IDisposable,因此它们的终结器(如果有的话)将负责在未对它们调用 Dispose() 时需要完成的任何工作(假设它们已正确实现)。
关于c# - 正确实现 IDisposable 来清理 Rx 观察者和长期存在的 Observables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12077450/