Все забывают о очень важной детали: вы должны удалить () элемент управления, иначе он утечет навсегда:
for (int ix = this.Controls.Count - 1; ix >= 0; ix--) {
if (this.Controls[ix] is PictureBox) this.Controls[ix].Dispose();
}
Я уделю больше внимания предложению forever , в комментариях много шума по этому поводу, класс Control не ведет себя как любой другой класс .NET. Элемент управления поддерживается его свойством Handle
. Который хранит родную ручку Windows. Пока существует собственное окно, объект Control не может быть уничтожен.
Это требует искусственного поддержания объекта в живых, когда вы используете Clear () или Remove () и удаляете элемент управления из его родителя. Winforms использует так называемое «окно парковки» в качестве хоста таких элементов управления. Это обычное родное окно, как и любое другое, его просто не видно. Его работа - быть родителем таких осиротевших элементов управления.
Окно парковки допускает множество хитрых трюков, которые обычно очень сложно сделать в Windows. Например, вы можете включать и выключать свойство ShowInTaskbar во время выполнения. Свойство окна, которое обычно можно указать только при создании окна (стиль WS_EX_APPWINDOW, указанный в вызове CreateWindowEx ()). Winforms могут сделать это даже после того, как вы создали окно, перемещая элементы управления формы в окно парковки, разрушая окно, создавая его снова и перемещая элементы управления назад. Ухоженная.
Но с не очень аккуратным зависанием, который является темой этого ответа, если вы удалите элемент управления и не вызовите его метод Dispose (), то он продолжит выживать в окне парковки , Навсегда. Истинная утечка. Ничего, что может сделать с этим сборщик мусора, он видит действительную ссылку на объект. Довольно грубое нарушение контракта IDisposable, вызов Dispose () является необязательным, но для класса Control это , а не .
К счастью, такую ошибку довольно легко диагностировать, она не требует специальных инструментов, вы можете увидеть утечку на вкладке "Процессы" в диспетчере задач. Добавьте столбец «Объекты пользователя».