Это вопрос C # WinForm. У меня есть дочерняя форма MDI, когда форма открыта, она будет генерировать много таблиц для отображения в DataGridView. Таблицы могут быть большими, и я использую DataBinding для соединения таблиц с DataGridView. Когда я закрываю форму, я замечаю, что память, занятая формой, своевременно восстанавливается.
Я использую обычный способ отображения дочерней формы MDI как:
var f = new FormBigMemory(objPassedIn);
f.Show();
Как показано здесь, я не могу явно вызвать метод Dispose () формы. Я предполагаю, что когда f выходит из своего жизненного цикла, .net автоматически восстанавливает память, которую он занимает.
Поскольку форма занимает много памяти, я хочу явно вызвать GC.Collect (); (Я знаю, что это может быть не очень хорошая идея). Для этого я изменяю код для отображения формы в диалоговой модели, используя следующий код:
using(var f = new FormBigMemoryDialog(objPassedIn);
{
f.ShowDialog();
}
GC.Collect();
Я очень разочарован тем, что память, занятая формой, не освобождается после вызова GC.Collect (). Я использую инструмент профилирования памяти, чтобы получить снимок памяти после закрытия формы и вызова GC.Collect (). Самая большая память поддерживается BindingList! Я действительно не понимаю: если вся форма удалена, почему BindingList все еще существует в памяти. Я проверил свой код, и нет места, где ссылка BindingList просочилась из формы.
Есть идеи, почему эта вещь со мной происходит? Большое спасибо за любые предложения и советы по управлению памятью .net.
Edit:
Спасибо за множество ответов. Позвольте мне прояснить некоторые моменты.
Я не хочу распоряжаться списком BindingList. BindingList используется в качестве массива в моем коде, поэтому я ожидаю увидеть восстановление памяти, хранящейся в BindingList. Мой плохой, чтобы не сказать ясно.
Я понимаю, что не нужно называть действие GC самостоятельно. Но в моем случае я хочу явно увидеть восстановление памяти, удерживаемое формой сразу после закрытия формы, в любом случае, чтобы сделать это? Пример кода?
В моей задаче я могу многократно открывать одну и ту же форму несколько раз, и каждый раз, когда я закрываю форму, потребление памяти увеличивается, пока не будет выдан OutOfMemory. Это явно не правильно. Я ожидаю увидеть, что после закрытия формы память возвращается к исходному уровню, и я могу многократно открывать форму и закрывать ее, не увеличивая объем памяти (резко).
Редактировать 2:
Я дополнительно исследовал код. Самый большой массив (BindingList) не освобождается после закрытия формы. На него ссылается BindingSource, а на BindingSource - EventHandler, CurrencyManager и пользовательский элемент управления. BindingSource и пользовательский элемент управления указываются в (закрытой) форме, а (закрытая) форма указывается некоторыми обработчиками событий.
Выше приведен снимок памяти после того, как я закрыл форму. Я использую модель диалога, чтобы открыть форму, и после ее закрытия вызывается ее метод Dispose (), и после этого я также вызываю GC.Collect (), чтобы принудительно восстановить память. Почему после этого экземпляр формы все еще существует в моем снимке памяти ??