Очистка элементов управления из FlowLayoutPanel не вызывает деструкторы?
Извините, если мне не хватает чего-то очевидного, но я пытаюсь очистить элементы управления (серию пользовательских элементов управления) от FlowLayoutPanel - (panelName).Controls.Clear();. К сожалению, кажется, что это не вызывает деструкторы для объектов на панели - столбец User Objects в диспетчере задач просто продолжает расти и подниматься, пока не достигнет 10000 и не выдаст исключение.
Кто-нибудь знает, что мне здесь не хватает?
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 есть нечто, называемое "финализаторы", которые синтаксически похожи на деструкторы в C#. Для получения дополнительной информации, посмотрите удивительную книгу Джеффа Рихтера о том, как работает CLR - CLR через C#.
Вы можете захотеть, чтобы объекты реализовали шаблон IDisposable, а затем вызовите их метод Dispose(), когда вы закончите с ними.
Попробуйте использовать профилировщик памяти(например, муравьи), он скажет вам, что поддерживает управление. Попытка угадать этот тип проблемы очень сложна.
Red-gate дает 14 дней, что должно быть более чем достаточно времени, чтобы решить эту проблему и решить, предоставляет ли профилировщик памяти долгосрочное значение.
На рынке есть много других профилировщиков памяти (например, .NET Memory Profiler), большинство из которых имеют бесплатные пробные версии, однако я обнаружил, что инструменты Red-Gate просты в использовании, поэтому, как правило, попробуйте сначала.