1

ViewModel の Reactive Extension (Rx) Observer をクリーンアップするためIDisposableに withを使用しています。CompositeDisposable

IDisposableこのシナリオでの ViewModelの適切な実装は何ですか? 通常、管理されていないオブジェクトがないため、ファイナライザーを実装しませんが、ファイナライザーは、呼び出しの失敗をキャッチDisposeして、オブザーバーが常に破棄されるようにするのに役立つようです。(私の Observable はアプリケーションの存続期間中インスタンス化されますが、ViewModels はそうではありません。)

ありがとう!

アップデート:

明確化: この場合、Dispose の呼び出しの必要性は少し異なります。Reactive Extensions の Observer は Dispose を使用して、Observable から自身をサブスクライブ解除します。私の場合、多くの短命のオブザーバーを持つ長命のオブザーバーがあるため、Observable->Observer 参照のために明示的に破棄されない限り、オブザーバーは GC になりません。私は Reactive Extensions にまったく慣れていないため、理解が間違っている可能性があります。

4

3 に答える 3

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 サブスクリプションの登録を解除するためにファイナライザーを使用して呼び出すべきではありません。ファイナライザーは、オブジェクトがガベージ コレクションされる直前にのみ呼び出され、ガベージ コレクションは、オブジェクトが参照できなくなったときにのみ発生します。現在のサブスクリプションがある場合は、参照があり、ガベージ コレクションは行われません。

.Dispose()サブスクリプションをクリーンアップするには、明示的に自分自身を呼び出す必要があります。

于 2012-08-23T01:55:54.673 に答える
1

通常よりも早く購読を解除したい場合を除き、Rx IDisposables を破棄する必要はありません。それらを漏らすだけです。これらはアンマネージ メモリを表していないため、CLR は他のオブジェクトと同様にそれらを GC します。また、これらのオブジェクトにファイナライザーを実装しないでください。

また、参照ループについて心配する必要はありません。CLR の GC はそれらを検出するのに十分スマートです (ちょうどあなたが持っていた場合のようにsomeA.B = someB; and someB.A = someA) 。

于 2012-08-22T20:14:07.850 に答える