TabVisible обходной путь - утечка памяти

Я пытаюсь реализовать расширенные классы TabControl / TabPage, чтобы реализовать настоящую функцию TabVisible, поскольку свойство TabPage Visible не работает должным образом.

Я работаю с C # / WinForms / VS2005 / .Net FW 2.0; Я реализовал код таким образом:

http://csharp.pastebin.com/AUnzRQLw

И я создал форму, чтобы проверить это, установив / сняв отметку CheckBoxes, чтобы показать / скрыть некоторые элементы управления VisibleTabPage, которые я добавил (http ..// csharp.pastebin.com/MkGJGx2G). Но после определенного количества щелчков по флажкам в случайной последовательности приложение начинает выделять все больше и больше памяти и использовать значительный объем ЦП для отображения / скрытия элементов управления TabPage.

Может ли кто-нибудь указать мне, где ошибка?


person Alexandre    schedule 06.08.2010    source источник
comment
Я бы посоветовал проверить, повторно инициализируете ли вы свои страницы вкладок, когда состояние флажка изменяется. Лучший способ проверить это - загрузить любой хороший профилировщик (Windbg и т. Д.) И выяснить, какие объекты существуют в памяти.   -  person Bharath K    schedule 06.08.2010
comment
Да, я использовал профилировщик памяти и обнаружил, что виноват объект ArrayList. Я создал частный список ArrayList, который я поддерживаю в течение всего времени существования объекта TabControlEx, и это решило проблему.   -  person Alexandre    schedule 07.08.2010


Ответы (1)


Это слишком много кода, чтобы с ним бороться. Однако я вижу, что вы используете такие методы, как Remove () и Clear (), даже не вызывая метод Dispose () для страницы вкладки. Эти страницы будут «припаркованы» и будут продолжать использовать системные ресурсы. Запустите Taskmgr.exe, вкладку «Процессы», «Просмотр» + «Выбрать столбцы», отметьте объекты User32. Вы, вероятно, увидите, что это число неограниченно возрастает, поскольку ваш код пропускает дескриптор для страницы вкладки и всех ее элементов управления.

person Hans Passant    schedule 06.08.2010
comment
Я нашел ошибку, это был ArrayList, который инициализировался много раз. Я создал частный список ArrayList, который я поддерживаю в течение всего времени существования объекта TabControlEx, и это решило проблему. В любом случае спасибо за совет. - person Alexandre; 07.08.2010