Очистка элементов управления FlowLayoutPanel, не вызывающих деструкторов?

Извините, если мне не хватает чего-то очевидного, но я пытаюсь очистить элементы управления (серию пользовательских элементов управления) от FlowLayoutPanel - (имя_панели).Controls.Clear();. К сожалению, это, похоже, не вызывает деструкторы для объектов на панели - столбец "Пользовательские объекты" в диспетчере задач просто продолжает расти вверх и вверх, пока он не достигнет 10 000 и выбрасывает исключение.

Кто-нибудь знает, что мне здесь не хватает?

4 ответа

Не решение, но обходное решение - объекты, кажется, разрушаются этим (грубым, из памяти) кодом:

while(FlowLayoutPanel.Controls.Count > 0)
 FlowLayoutPanel.Controls.Remove(0);


Обходное решение

eftpotrm выше, тем не менее, продолжает увеличивать количество обработчиков пользователей, однако, если вы просто вручную удалили после удаления элемента управления, это зафиксировало его на 100% для меня.

while (myFlowLayoutPanel.Controls.Count > 0)
{
 var controltoremove = myFlowLayoutPanel.Controls[0];
 myFlowLayoutPanel.Controls.Remove(controltoremove);
 controltoremove.Dispose();
}


У .NET нет концепции деструкторов. У .NET есть что-то, называемое "финализаторы", которые выглядят синтаксически как деструкторы в С#. Для получения дополнительной информации ознакомьтесь с замечательной книгой Джеффа Рихтера о том, как работает CLR - CLR через С#.

Вы можете захотеть, чтобы объекты реализовали шаблон IDisposable, а затем вызовите их метод Dispose(), когда вы закончите с ними.


Попробуйте использовать профайлер памяти, (например ants), он расскажет вам, что поддерживает управлять живым. Попытка 2-го угадать, что этот тип проблемы очень тяжелый.

Red-gate дает 14-дневный хвост, который должен быть более чем достаточно времени для решения этой проблемы и решить, дает ли профилировщик памяти долгосрочное значение.

лоты других профилировщиков памяти на рынке (например, .NET Memory Profiler) большинство из них имеют бесплатные испытания, однако я обнаружил, что инструменты Red-Gate просты в использовании, поэтому сначала попробуйте их.

licensed under cc by-sa 3.0 with attribution.