2012-09-17 2 views
0

У меня есть форма, которая может быть динамически добавлена ​​в элемент управления вкладки devexpress. Когда вы щелкаете вкладку в первый раз, элемент управления есть. Вы можете добавить дополнительные, как вам удобно. На каждом из них есть кнопка удаления. Однако, если вы нажмете кнопку «Добавить», она добавит около 30 МБ в текущий процесс. Когда вы удаляете один из них, MB остаются в памяти.Использование памяти с приложением winform

Мой код удаления:

MyCustom temp = this._UIList[idx] as MyCustom; 
if (this._UIList.Count == 1) 
{ 
temp.Clear(); 
} 
else 
{ 
if (temp != null) 
    { 
     this._UIList.RemoveAt(idx); 
      this._UIList.TrimToSize(); 
      this.pnlInner.Controls.Remove(temp); 
      temp.CleanUP(); 
      temp.Dispose(); 
      //now reshuffle all the note controls 
      ReshuffleMyCustomControls(); 
    } 
} 

Любое направление было бы очень полезно. Благодарю.

+1

что 'MyCustom'? что делает 'ReshuffleMyCustomControls'? –

+0

Вы должны _Temporarily_ добавить GC.Collect(); звоните, чтобы убедиться, что память еще не была собрана мусором ... – Osiris

+0

MyCustom - это пользовательский элемент управления, который добавляется в форму при нажатии кнопки добавления. Reshuffle устанавливает idx того, который не удаляется в 0, и перемещает его в начало формы. – user766595

ответ

1

Убедитесь, что вы удалили обработчики событий, которые были подключены. Они могут хранить ссылку в памяти.

Вы должны были бы сделать что-то подобное для любого события вы проводную до:

stripevents(AddressOf Any_Control_ValChanged) 
    stripevents(AddressOf Any_EnterControl) 
    stripevents(AddressOf Any_LeaveControl) 
    stripevents(AddressOf ButtonClick) 

Sub stripevents(ByVal eh As EventHandler) 
    [Delegate].RemoveAll(eh, eh) 
End Sub 
+0

Похоже, это сработало, но только после того, как GC побежал. Это то, что должно случиться? – user766595

+0

Да ... Вы можете сказать, делает ли он что-либо, пытаясь только GC и видя, все еще уменьшает память. это предполагает, что вы выполняете явный GC.Collect. Если нет, то * конечно * это полностью по дизайну; никакие установочные объекты ни к чему, ничего, кроме действия Бога, не заставят память освободиться, если GC не будет работать. Если вы никогда не читали хорошую статью о работе с памятью, связанной с мусором, сделайте это, это очень умно - а не ракетостроение, вы поймете это! (если вы уже знаете, что извините, не было никакого оскорбления) – FastAl

+0

Теперь, если это исправление ... Посмотрите, можете ли вы обойтись без GC.Collect (если вы это делаете) Но не беспокойтесь, если вы нужно оставить GC.Collect. Вы просто должны знать, что это заблокирует ваше приложение в течение 10-500 миллисекунд. Если вы в порядке с этим, вы можете использовать GC. Я только говорю это, потому что многие люди моралисты о явных призывах к GC.Collect. Как сертифицированный крематорий-богослов, я могу с полной уверенностью сказать, что даже 1 миллиард дополнительных звонков в GC.Collect с вашей стороны не будет стоить вам даже одной дополнительной секунды в чистилище. Может быть, 100 мс, топы. – FastAl

Смежные вопросы