2012-01-18 9 views
0

私はWPFアプリケーションを持っています。それはメモリリークがあります。私は正確に理由を見つけるのが難しいです。 メモリリークを避けるために、イベントを適切に処理する方法はありますか?

はANTSプロファイラを使用することを試みたが、私が見つけた最もよい事は、私はイベント public event Action RegistryPropertyChanged

を持っていると私は、そのイベントに登録していること、私のコードでは、多くの他のイベントのを、持っている

です。例

preferences.RegistryPropertyChanged+= new Action (SetupToolTips); 

、そのうちのいくつかは、この方法には、使用する、動的または静的ましだ方法

preferences.RegistryPropertyChanged += OnMSChanged; 

に登録されているために

?何が原因で漏れを引き起こす可能性がありますか?

すべての行を削除しようとしたところ、それはRegistryPropertyChangedで使用されていましたが、漏れはありませんでした。だから何かこのイベントでは間違っていますが、私はちょうど理由を見つけることができません。何かアイデアと助けに感謝します。

+0

http://blog.thekieners.com/2010/02/11/simple-weak-event-listener-for-silverlight/ –

+0

http://blogs.msdn.com/b/jgoldb/archive/2008/ 02/04/finding-memory-leaks-in-wpf-based-applications.aspx –

+0

「メモリリーク」とみなされるのは正確です。アプリケーションがシステムにメモリの問題を引き起こしていますか? –

答えて

3

を望むように収集されません知っているフォールバックあなたのタスクマネージャで成長していない場合。たとえば

preferences.RegistryPropertyChanged -= OnMSChanged 

また、私はメンバーの参照を介して他のオブジェクトをホストされたオブジェクトを持っていた問題がありました。たくさんのオブジェクトを使って作業しているのであれば、オブジェクトの処理が完了した時点でメモリ参照を削除していない可能性があります。

Carオブジェクトがあり、それがEngineオブジェクトをホストしている場合は、Carオブジェクトが終了したときにEngineオブジェクトのメンバ参照をNULLに設定してください。 システムのどこかで活発に使用されている参照がある場合、これらのオブジェクトは「アクティブ」なので破棄されないため、これを行う必要があります。

これはすべて非常に高いレベルですが、役立つことを願っています。

+0

ありがとう、私はそれをやろうとします。 – User1234

1

hereは、イベント、弱いイベントなどについての非常に良い投稿です。 hereはあなたのメモリリークを見つけるのに適しています。

EDIT:qiuckと汚れたテストが必要な場合。正しく収集されていないと思われるコンポーネントを取り出し、コンポーネントに追加してアプリケーションを実行します。

private byte[] myMemoryTest = new byte[300 * 1024 * 1024]; //allocate 300MB 

あなたのメモリは、イベントが処分に切り離されていることを確認し、あなたのオブジェクトを操作する場合は、そのあなたが

+0

非常に興味深い記事をありがとう。 – User1234

関連する問題