2012-05-02 9 views
2

私は私のviewmodelsが正しく確定されていることを確認助けるために自分のアプリケーションでフォローコードを持っている:オブジェクトのデバッグを完了できませんでしたか?

#if DEBUG 
    static int openViewModels = 0; 

    protected AbstractViewModel() 
    { 
     openViewModels++; 
    } 

    ~AbstractViewModel() 
    { 
     openViewModels--; 
     System.Diagnostics.Debug.WriteLine(openViewModels); 
    } 
#endif 

私のアプリケーションのすべてのviewmodelsは、このクラスから派生しています。時間がたつにつれて、openViewModelsが増加し、一部のviewModelがファイナライズに失敗していることがわかります。

私は自分のコードを見てきましたが、いくつかのオブジェクトが何の原因になっているのか分かりません。これらのオブジェクトがファイナライズされないようにするためのツールや手順はありますか?

+0

ビューモデルにIDisposibleが実装されていますか? – user957902

答えて

4

まず、スレッドレースにはオープンしています。それはInterlocked.Increment(ref openViewModels)Interlocked.Decrement(ref openViewModels)である必要があります。

第2に、ファイナライズは非決定的です。あなたが強制しない限り、あなたはそうしてはいけません。特定の時間スケールでそれらをクリーンアップすることを期待してはいけません。ファイナライズはメモリ圧迫要因です。

+0

デストラクタが階層チェーンで正しく呼び出されるかどうか知っていますか?私は彼らが[MSDN](http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx)を行うと思ったでしょうが、デストラクタは継承またはオーバーロードできません。 – Ian

+1

@Ian率直に言って、もしそれが重要であれば、「バーチャルコールを使用するIDisposableを使用するので、あなたが望むように正確に動作します。 AFAIKはい、あなたは異なるレベルでファイナライザを持つことができます。ここに行く:http://pastie.org/3848664 –

+0

IDisposableパターンについて同意した。なぜ私は覚えていないのですか?私は自分自身にしばらく前にファイナライザに関する質問をしていました。私はDisposeを使用しない限りファイナライザを完全に避けようとする傾向があります。 – Ian

3

オブジェクトのファイナライズが保証されていません。確実なファイナライズが必要な場合は、IDisposableを実装する必要があります。

+0

私は 'IDisposable'を実装して、イベントハンドラをクリアするようなことをします。これが可能であれば、私は明示的にここで物事を確定するつもりはありません。 – Oliver

+0

ファイナライザで 'Dispose'を呼び出すことをお勧めします。したがって、ここでクリーンアップコードを持つ必要はありません。 * Dispose Pattern *の解説はhttp://msdn.microsoft.com/en-us/library/fs2xkftw.aspxを参照してください。私はあなたが正しくあなたを理解しているかどうかは完全には分かっていないので、これがあなたの質問に答えることができない場合、またはこれがまったく問題ではない場合は、すみません。 :) –

関連する問題