В приложении 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();
}