11

応用:

  • 上部のテキストボックスと下部のリストボックスで構成されるWPFアプリケーション
  • ユーザーがテキストボックスに文字列を入力して従業員を検索すると、検索結果がリストボックスに表示されます
  • ListBoxは、DataTemplatesを使用して要素を表示します(従業員名、部門、電話番号、サムネイル画像を表示します)。

実装:

  • アプリケーションの起動時に、データベースにクエリを実行し、リストボックスに表示されるすべての従業員と関連情報を取得します。これは常にメモリに保持されます。
  • アプリケーションの起動後、検索可能なデータはすべてメモリ内にあり、検索は事実上瞬時に行われます。すべての検索は、すでにメモリにあるデータに対して実行されます。
  • 検索結果は、DataTemplatesを使用してリストボックスに表示されます。サムネイル画像、名前、電話番号、部門などが各リストボックス項目に表示されます。

問題:

  • 起動時のメモリ使用量は約200MBです。
  • 新しい検索またはリストボックスを下にスクロールするだけでリストボックス内のデータが変更されると、メモリ消費量が増加します。
  • ユーザーがリストボックスをゆっくりと下にスクロールすると、メモリがより速く増加します。上下にスクロールすると、メモリはすぐに1GBに達します。

コントロールを手動で作成するコードはありません。すべてがデータバインディングを介して行われます。

なぜこの動作が見られるのですか?それを修正するにはどうすればよいですか?助けてください!

更新:問題はメモリリークではないことがわかりました。ここでの問題は、リストボックスが従業員の画像を表示するオブジェクトを作成しており、リストボックスアイテムがウィンドウから出た後、ガベージコレクター用にリリースされていないことです。CleanUpVirtualizedItemイベントは予想どおりに発生しますが、メモリはまだ解放されていません。何か案は?

4

5 に答える 5

8

glib であるリスクがあると、メモリ リークが発生します。ANTS *のようなツールを使って追跡してみてはいかがでしょうか。無料トライアルがあり、私は利用したことがありませんが、評判は良いです。

*その他のプロファイリング ツールが利用可能です。

別のツールを使いたくない場合は、クラスが作成されるたびに静的メンバーをインクリメントし、インスタンスが破棄されるたびにメンバーをデクリメントするなどの方法を試すことができます。これは、適切に破棄されていないインスタンスを追跡するのに役立ちます。

于 2009-05-08T20:26:03.937 に答える
3

あなたが使用することができます

WPF パフォーマンス スイート

WPF アプリケーションのパフォーマンスの最適化

同様の問題が私を悩ませています.. (のようなもの)

アプリケーションの起動時に、データベースにクエリを実行し、ListBox に表示されるすべての従業員と関連情報を取得します。これはずっとメモリに保持されます。

WPFに従うようにコードを変更できるかもしれません: データの仮想化

于 2009-05-14T09:43:25.923 に答える
1

本当にメモリリークしているようです。おそらく、DataTemplate の一部の UI 要素は、UI 要素が破棄されても存続する必要がある他のオブジェクトへの参照を保持します。

イメージ コントロールでメモリ リークが発生する可能性があります。テンプレートから削除してみて、結果を確認してください。また、コントロールの Loaded イベントなどにサブスクライブしていますか?

いくつかの推測ですが... 人々がここですでに言ったように、パフォーマンスとメモリのプロファイラーでアプリを本当に見たいと思うかもしれません。

于 2009-05-15T16:21:32.590 に答える
0

一見無害な状況で、WPF および .NET 3.5 SP1 wrt メモリの問題にいくつかの問題があることに気付きました。

いくつかのリソースを見つけましたが、それらがあなたに役立つかどうかはわかりません:

http://blog.ramondeklein.nl/?p=58

そのブログ投稿では、状況が説明されています。

  1. スタイルは、アプリケーションの ResourceDictionary で定義されます。
  2. このスタイルは、メディア エフェクト (つまり、DropShadowEffect) を使用するコントロール テンプレートを使用します。
  3. メディア効果は StaticResource を使用して参照する必要があります

一言で言えば、あなたの解決策は、メディア効果 (ドロップシャドウなど) が静的リソースを使用するようにすることだと思います。

于 2009-05-12T18:46:10.020 に答える
0

私が大いに役立ったことの 1 つは、Stream クラスをラップするクラスを使用したことです。これはここで詳しく説明されており、この方法を使用して多くのメモリを節約できたことは確かです。WPF は実際に、各画像の基になるバイト [] とストリームへの参照を保持します。

于 2009-05-21T20:59:10.537 に答える