応用:
- 上部のテキストボックスと下部のリストボックスで構成されるWPFアプリケーション
- ユーザーがテキストボックスに文字列を入力して従業員を検索すると、検索結果がリストボックスに表示されます
- ListBoxは、DataTemplatesを使用して要素を表示します(従業員名、部門、電話番号、サムネイル画像を表示します)。
実装:
- アプリケーションの起動時に、データベースにクエリを実行し、リストボックスに表示されるすべての従業員と関連情報を取得します。これは常にメモリに保持されます。
- アプリケーションの起動後、検索可能なデータはすべてメモリ内にあり、検索は事実上瞬時に行われます。すべての検索は、すでにメモリにあるデータに対して実行されます。
- 検索結果は、DataTemplatesを使用してリストボックスに表示されます。サムネイル画像、名前、電話番号、部門などが各リストボックス項目に表示されます。
問題:
- 起動時のメモリ使用量は約200MBです。
- 新しい検索またはリストボックスを下にスクロールするだけでリストボックス内のデータが変更されると、メモリ消費量が増加します。
- ユーザーがリストボックスをゆっくりと下にスクロールすると、メモリがより速く増加します。上下にスクロールすると、メモリはすぐに1GBに達します。
コントロールを手動で作成するコードはありません。すべてがデータバインディングを介して行われます。
なぜこの動作が見られるのですか?それを修正するにはどうすればよいですか?助けてください!
更新:問題はメモリリークではないことがわかりました。ここでの問題は、リストボックスが従業員の画像を表示するオブジェクトを作成しており、リストボックスアイテムがウィンドウから出た後、ガベージコレクター用にリリースされていないことです。CleanUpVirtualizedItemイベントは予想どおりに発生しますが、メモリはまだ解放されていません。何か案は?