8

私は WPF MVVM ビジネス アプリケーション フレームワークを構築することを計画していましたが、調査を行っているときに、WPF プラットフォームでのメモリ リークに関する多くの記事に出くわしました。

Windows Presentation Foundation でデータバインディングを使用すると、メモリ リークが発生することがある
DataBinding (Black Magic) を使用して WPF メモリ リークを
回避
する

しかし、それらのほとんどは 2007 年と 2008 年にさかのぼるので、どれが解決されていてどれが解決されていないのか疑問に思っていました。

つまり、フレームワークを構築する際に考慮したり、一般的に (WPF 4.0、.NET 4.0) を監視したりするメモリ リーク (発生する可能性がある) の原因は何ですか?

編集:より具体的にしようと思います。独自のソリューションを開発しなくても、WeakEventManagerとそのサブクラスを利用してイベントをリッスンできますか?

編集2:さらに具体的に。を使用して、WPF だけでなく .NET の一般的なイベントによって引き起こされるメモリ リークの問題を解決できますWeakEventManagerか? もしそうなら、なぜそれは一般的な .NET 名前空間ではなく、WPF 名前空間の一部なのですか?

4

1 に答える 1

8

最初に頭に浮かぶのは:

  • System.Windows.Interactivity.Behavior から System.Windows.Interactivity.dll: 予期したときに動作がデタッチされない場合があり、その逆も同様であり、gc を生き残るためにコントロールに追加されたイベント ハンドラーが残されます。
  • あなたの説明だけで、将来サードパーティのコンポーネントを使用することになると確信しています。これは、リークの第一級の候補であることがわかりました

始める前にこれを検討しているという事実はプラスです。優れた MemoryProfiler に投資し、最初から定期的にアプリをプロファイリングすれば問題ありません。

編集: あなたの編集にコメントするには: リンクをチェックして、3 つの主要なトピックを分離できると思います:

  • INotifyPropertyChanged の実装は必須です。最初の開発者が「これは静的なビューにすぎません。データはモデルで変更されません。INPC をスキップしただけです」と言っている場合は、描画して公開する必要があります。さらに良いことに、フレームワークでこのインターフェイスの実装を強制するか、少なくとも開発者ができるだけ簡単に使用できるようにする必要があります。
  • PropertyDescriptors にバインドしないでください。これはそもそも明白ではないかもしれませんが、フレームワークは、カスタム ビューモデル プロパティにバインドするためだけにそれを使用する開発者向けのパスを設定する可能性があります。
  • 私の意見では、これはコードの衛生状態の問題です

弱いイベントに関するあなたの編集に関しては、はい、これはうまくいくかもしれません。個人的には、登録しているイベントを公開しているモデルが予想よりも早くクリーンアップされる状況につながる可能性があるため、この良い方法は考慮しません。余分な距離を歩き、意識的にハンドラーの登録を解除することをお勧めします。

于 2013-07-15T14:39:03.280 に答える