Как правильно обрабатывать события, чтобы избежать утечки памяти? - PullRequest
0 голосов
/ 18 января 2012

У меня есть приложение WPF. Это утечка памяти. У меня есть проблема, чтобы найти именно причину.

Пытался использовать профилировщик ANTS, и лучшее, что я нашел, это

У меня есть событие public event Action RegistryPropertyChanged

И у меня есть много других событий в моем коде, которые регистрируются на это событие.

Например

preferences.RegistryPropertyChanged+= new Action (SetupToolTips);

И некоторые из них регистрируются таким образом

preferences.RegistryPropertyChanged += OnMSChanged;

Какой способ лучше использовать: динамический или статический? Есть идеи, что может вызвать утечку?

После того, как я попытался удалить все строки, используемые RegistryPropertyChanged , утечки не было. Так что что-то не так со всеми этими событиями, но я не могу найти точно причину. Любые идеи и помощь приветствуются. Спасибо

Ответы [ 2 ]

3 голосов
/ 18 января 2012

При работе с вашими объектами, убедитесь, что событие развязано при утилизации.
Например:

preferences.RegistryPropertyChanged -= OnMSChanged

Также у меня была проблема, когда у меня был объект, который размещал другие объекты через членРекомендации.Если вы работаете с большим количеством объектов, вполне вероятно, что вы не удаляете ссылку на память, когда закончите работу с объектом.

Просто пример, но если у вас есть объект Car и он содержит объект EngineУбедитесь, что вы установили ссылку на элемент Engine в NULL, когда закончите с объектом Car.Вы должны сделать это, потому что если есть хоть одна ссылка на что-то, что активно используется где-то в вашей системе, эти объекты не будут расположены, потому что они «активны».

Это все очень высокий уровень,но я надеюсь, что это поможет.

1 голос
/ 18 января 2012

здесь - очень хороший пост о событиях, слабых событиях и так далее. И здесь является хорошей отправной точкой для обнаружения утечки памяти.

РЕДАКТИРОВАТЬ: если вы хотите тест Qiuck и грязный. возьмите компонент, который, по вашему мнению, собран неправильно, и добавьте его в свой компонент и запустите приложение.

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

если ваша память растет в вашем менеджере задач и не резервируется, вы знаете, что она не собирается так, как вы хотите

...