2

ビューモデルが正しくファイナライズされていることを確認するために、アプリケーションに次のコードがあります。

#if DEBUG
    static int openViewModels = 0;

    protected AbstractViewModel()
    {
        openViewModels++;
    }

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

私のアプリケーションのすべてのビューモデルは、このクラスから派生しています。時間の経過とともにopenViewModels増加することがわかりました。これは、一部のビューモデルがファイナライズに失敗していることを意味します。

これがなぜなのかを理解するのに苦労しています - コードをじっと見ましたが、一部のオブジェクトが残っている原因がわかりません。これらのオブジェクトのファイナライズを妨げている原因を突き止めるのに役立つツールや手順はありますか?

4

2 に答える 2

5

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

第二に、ファイナライズは非決定論的です。強制しない限り、それはすべきではありません。特に大量のメモリを使用できる場合は、特定の時間スケールでそれらがクリーンアップされることを期待しないでください。ファイナライズは、メモリ不足の要因です。

于 2012-05-02T13:01:27.250 に答える
3

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

于 2012-05-02T13:04:04.537 に答える