В приложении WinForms у меня есть несколько случаев, когда я добавляю элемент управления в контейнер в ответ на действие пользователя (panel.Controls.Add(new CustomControl(...))
), затем позже очищаю панель (panel.Controls.Clear()
) и повторно использую ее.
В работе приложение иногда выдает исключение, связанное с ошибками GDI или с ошибкой загрузки ImageList
.Это обычно происходит на машинах с ограниченными ресурсами и с пользователями, которые интенсивно используют приложение в течение дня.Кажется довольно очевидным, что у меня есть утечка ручки GDI и что я должен избавиться от элементов управления, которые вычищены из контейнера, однако любые объяснения, которые я могу найти, являются неопределенными относительно того, где и когда должен быть расположен элемент управления.
Должен ли я утилизировать дочерние элементы управления сразу после очистки контейнера?Что-то вроде:
var controls = new List<Control>(_panel.Controls.Cast<Control>());
_panel.Controls.Clear();
foreach (var c in controls) c.Dispose();
Или я должен отслеживать элементы управления в списке и вызывать dispose в методе Dispose()
контейнера?Такие как:
List<Control> _controlsToDispose = new List<Control>();
void ClearControls()
{
_controlsToDispose.AddRange(_panel.Controls.Cast<Control>());
_panel.Controls.Clear();
}
void Dispose()
{
...
foreach (var c in _controlsToDispose) c.Dispose();
}