У меня есть WindowsForm с панелью управления, которую я использую для отображения пользовательских элементов управления. Я добавляю элементы управления таким образом:
private void AddControl(Control control)
{
panel.Controls.Clear();
control.Size = new Size(panel.Width - 1, panel.Height - 1);
control.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles. Top;
panel.Controls.Add(control);
}
..
AddControl(new ucSomeControl());
Я просто нажал на каждую кнопку, которая использует AddControl (), и увидел, что использование памяти увеличивается с каждым разом. Я оставил приложение запущенным, ничего не делая, в течение полутора часов, и использование памяти было уменьшено с 140 МБ до 138 МБ, как 2 МБ. Как вы думаете, это нормально, или я делаю что-то не так с моим методом добавления элементов управления, который я должен / мог бы улучшить для меньшего использования памяти?
Followup
Я создал 4 версии своего приложения: Debug, Release, with Dispose, с вызовом manuel GC.
С моим исходным кодом
Существует небольшая разница между отладочной и выпускной версиями моего приложения, когда речь идет об использовании памяти, например, 5 МБ. Проблема с этими версиями заключается в том, что чем больше я нажимаю на кнопки, даже если я нажимаю ту же кнопку и снова создаю тот же UserControl, использование памяти также увеличивается.
С утилизировать
Я добавил код Криса Арнольда Dispose. Использование памяти значительно ниже, и хотя создание большего и большего количества элементов управления все еще увеличивает использование памяти, теперь каждый элемент управления использует намного меньше памяти. Это было достойное дополнение.
С вызовом manuel GC
Я добавил этот код после Dispose:
GC.Collect();
GC.WaitForPendingFinalizers();
Бинго! Даже меньше использования памяти, чем утилизировать код. Самое приятное то, что даже если я создаю новые элементы управления снова и снова, увеличение использования памяти очень мало, почти тривиально.
Мне очень понравилось использовать метод Dispose + GC, но каждая отдельная статья, которую я написал о вызовах manuel GC, категорически не одобряет его использование. Даже если у меня нет пользовательских финализаторов / деструкторов, я не решил использовать их или нет ..