Очистка элементов управления из 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 просты в использовании, поэтому, как правило, попробуйте сначала.

Другие вопросы по тегам