私は最初のMVVMアプリケーションを作成しました。アプリケーションを閉じると、ObjectDisposedExceptionによってクラッシュが発生することがよくあります。クラッシュは、アプリウィンドウが消えた直後に、アプリケーションが停止すると表示されます。
スタックトレースを取得するのは困難でしたが(他の質問を参照)、最終的にスタックトレースが完全にC#ライブラリ(kernel32!BaseThreadStart、mscorwks!Thread、mscorwks!WKSなど)に含まれていることがわかりました。
さらに、このクラッシュには一貫性がありません。私の最後のチェックアウトと再構築の後、それは起こりませんでした...しばらくの間。それから戻ってきました。それが起こり始めると、私が「クリーン」にして再構築しても、それは起こり続けます。ただし、ワイプアンドチェックアウトによってしばらく停止することがあります。
私が考えていること:
私のViewModelsを破棄するとき、GarbageCollectorは何か面白いことをしていると思います。私のViewModelBaseクラスデストラクタには、デストラクタが呼び出されたときにログに記録するWriteLineがあり、4つのViewModelのうち、2つまたは3つだけが破棄され、チェックアウトによって異なるようです(たとえば、私のもので実行すると、一貫して繰り返されますシーケンスですが、私の同僚は、異なるオブジェクトが配置された異なるシーケンスを見ています)。
スタックトレースには私のコードの呼び出しが含まれていないので、それは、破棄されたオブジェクトのメソッドを呼び出しているのは私のコードではないことを意味すると思います。そのため、CLRは馬鹿げていると思います。
これは意味がありますか?GCの一貫性を保つ方法はありますか?これは赤いニシンですか?
役立つ可能性のあるその他の詳細:
すべてのビューとViewModelは、App.xaml.csファイルのアプリケーションのStartupイベントハンドラーで作成されます。同じハンドラーがViewModelsをDataContextsに割り当てます。これが正しいMVVMプラクティスであるかどうかはわかりませんが(私が言ったように、私の最初のMVVMアプリ)、なぜそれが悪い動作を引き起こすのかわかりません。
必要に応じてコードを貼り付けることができます。