20

MVVM パターンを利用する中規模の WPF アプリケーションに取り組んでいます。ViewModel はINotifyPropertyChanged、それぞれのビューを更新するために使用します。

このアプローチは、1 つの問題を除いて完全に機能します。このアプリケーションを長期間 (3 ~ 7 日間) 実行したままにすると、ビュー (アプリ全体のすべてのビュー!) がバインドされたプロパティの更新を突然停止します。

ViewModel にブレークポイントを設定すると、PropertyChanged問題がないように呼び出されて、楽しく動作します。ただし、View がバインドされている ViewModel オブジェクトのいずれかの getter にブレークポイントを設定すると、getter が呼び出されることはありません。

私はこの時点で困惑しており、この問題を適切にデバッグする方法さえ知りません。Visual Studio の出力ウィンドウでデータ バインディング エラーを確認しましたが、すべて正常に見えます。WPF データ バインディング エンジンがバックグラウンドでクラッシュしたかのようです。AppDomain.UnhandledExceptionこのアプリは未処理の例外 (および)も監視Dispatcher.UnhandledExceptionしていますが、例外はスローされていません。

概要: 長期間経過した後、View はデータ バインディングの更新を停止しますが、ViewModel は引き続き PropertyChanged イベントを呼び出しています。

何かアドバイス???

4

2 に答える 2

3

数か月のデバッグの後、リモート ターゲットにデバッガーを接続することで、ようやく問題を解決することができました。そうして初めて、デバッグできる例外が生成されました。AppDomain.UnhandledException と Dispatcher.UnhandledException がこの例外をキャッチしなかった理由はまだわかりませんが、少なくとも理解できました。

于 2012-11-09T19:33:13.953 に答える
1

熱心すぎる弱参照の犠牲になる可能性があります。MVVMフレームワークに修正がある可能性があります。そうでない場合、この情報はソースコードで問題を見つけるのに役立つ可能性があります。

INotifyPropertyChangedのほとんどの実装には、既知のメモリリークがあります。ビューモデルは、XAMLコントロールのPropertyChangedハンドラーのデリゲートをハード参照します。そのデリゲートは、XAMLコントロールをハードリファレンスします。このため、ビューモデルが存在する限り、コントロールを収集することはできません。

したがって、この問題を修正するために、多くのMVVMフレームワークはイベントに弱参照を使用します。これによりメモリリークを修正できますが、発生している問題を引き起こす可能性もあります。ウィークイベントが適切に実装されていない場合、XAMLコントロールが実際に収集される前に削除される可能性があります。

弱参照のMVVMフレームワークを使用していて、それらが時期尚早に破棄されていると思われます。これが問題である可能性が高いかどうかを確認するには、GC.Collect()を数回呼び出して、問題がより頻繁に発生するかどうかを確認します。

于 2012-09-12T18:04:03.953 に答える