2011-12-29 21 views
2

WPF TreeViewコントロールで問題が発生しています。 私はこのコントロールといくつかのパフォーマンスの問題でメモリリークの問題に遭遇したと思います。 私はこれらの問題を見ることができるシンプルなデモソリューションを用意しました。 ダウンロードリンク:http://www.custom-projects.com/TreeViewMemoryAndPerformanceIssue.zipWPFのTreeViewでのメモリリークとパフォーマンスの問題

私はいくつかのドメインオブジェクトに基づいてツリーを作成しています。オブジェクトはビューモデルでラップされます。 レベルの数は制限されていませんが、現時点では最大3レベルです。

したがって、各ビューモデルは子を持つことができます。

UpDownコントロールの上/下ボタンをクリックしてマウスボタンを離さないと、int値の更新速度が遅くなり、メモリ消費量が絶えず増加することがわかります。

私がしていること:上/下ボタンをクリックすると、データバインディングを介して値がビューモデルに送信されます。セッターで私はイベントを起こしています。私たちのアプリケーションはさまざまなビューモデルで構成され、誰かがその中のデータを変更している場合、他の人はこれらのDataChangedイベントを通じて通知されます。

簡単にするために、私のデモソリューションは、NavigationViewModelで構成されています。したがって、DataChangedイベントのために をリッスンし、発生するとツリーがレンダリングされます。

リストは常に同じで(行が追加または削除されるだけで)ないため、私はObservableCollectionを使用していません。ユーザーが追加/作成したオブジェクトに基づいてリストを再生成する必要があります。

とにかく、これらのビューモデルをリストに追加し、NotifyPropertyChangedイベントを発生させます。 WPFがツリーを更新するようにします。うまく動作しますが、リストが更新されるほどアプリケーションが遅くなり、メモリも増えます。

アイテムビューモデルがガベージコレクションされていることを確認しましたので、私は 私の側に何か間違って表示されません。私もパフォーマンスプロファイリングをしました。私のコードは遅くならないので、 の問題はWPF側にあります。 Application.Runメソッド 実行時間が長くなる...奇妙なこと。

メモリが増えていて、決して解放されない理由は誰ですか、なぜ、 のパフォーマンスが低下し始めたのか、TreeView自体が更新されるのでしょうか?

この問題に関するご意見やご感想をお寄せいただきありがとうございます。

おかげで、 クリスチャン

+0

*バンプ* 多分答えを知っている誰かが私の質問を見たことがありません。 – Christian

答えて

1

ANTSメモリプロファイラを使用してテストアプリケーションをプロファイリングしたところ、クラス 'NavigationItemBaseViewModel'と配列NavigationItemBaseViewModel []は参照によってメモリに保持されていることがわかりましたが、これは各インクリメントで悪化しています。

徐々に増分して更新を許可すると、参照が壊れてオブジェクトが破棄されます。すべての良い。 しかし、高速/連続的にインクリメントすると、参照が壊れていないことがわかります。したがって、配列はメモリ内に保持されます。

アプリケーションがこれらのビューモデルを多く更新する必要があるため、増分は毎回遅くなります。インクリメント#58では、それらの間に172個の配列があります。NavigationItemBaseViewModel。 「通常の」機能では、4つの配列と13のNavigationItemBaseViewModelしか持たない。

私がお勧めするのは、新しいアレイを作成している場所のロジックを把握できない場合は、メモリをプロファイルすることをお勧めします。通常、配列を再利用するのが最善です。私が使用し

プロファイラはここにある:助けhttp://www.red-gate.com/products/dotnet-development/ants-memory-profiler/index2

希望。

+0

こんにちはDene、それを行う時間を取ってくれてありがとう、プロファイラへのリンクのために非常に感謝します。私はjetBrainsのパフォーマンスプロファイラを使用し、アプリケーションのRunメソッドの実行時間が上昇したことを確認しました。 – Christian

+0

私はあなたの入力と調査結果に基づいてさらに調査を行います。再度、感謝します!!キリスト教の – Christian

0

私はWPFでメモリリークの多くを調査していたと私は、このツールは非常に便利見つける:http://www.jetbrains.com/profiler/それは10日間の試用期間があります(私はちょうどチェックしました)ので、私はあなたのことを願っていますあなたの問題を見つけることができます。

関連する問題