Полностью сформируйте распоряжение и освободите память - PullRequest
0 голосов
/ 16 февраля 2019

Я уже прочитал тонну тем о "утилизации класса", и я понял, как это сделать, и это прекрасно работает!В то же время «форма удаления» не то же самое, и ресурсы все еще протекают!

Что я делаю:

Инициализация формы с помощью метода «using»:

Using f as New Form
    f.ShowDialog()
    'my code
End using

В этом случаеформой «end using», оканчивающейся методом «Dispose».

Например:

У меня есть форма, у которой есть класс (он содержит параметры и другие классы).При событии формы инициализации форма (сама по себе) занимает 12 МБ памяти (я измеряю ее в проводнике процессов), и плюс мой класс занимает 10 МБ (который удаляется, а также удаляется до формы Dispose по событию Dispose).После удаления моей формы (я снова ее измеряю) я вижу, что мой класс удален, а ресурсы (класса) полностью бесплатны, форма не освобождает ресурсы.Другими словами, я убиваю 10 МБ (класса), НО не убиваю 12 МБ (формы).

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

Private Sub Form_Disposed(sender As Object, e As EventArgs) Handles 
Me.Disposed
    If Not fDisposed Then
        MyPersonalClass.Dispose()'class
        MyPersonalClass = Nothing
        fDisposed = True
        GC.SuppressFinalize(Me)
        GC.Collect()
        Finalize()
    End If
End Sub

Это очень плохо.Если большую часть времени я работаю с этими формами и если они не освобождают ресурсы после утилизации, каждая открытая форма будет оставлять около 10-12 МБ в памяти после закрытия.И если я открою свою форму 100 раз, она замерзнет более чем на 1 ГБ памяти.

Что я делаю не так?

1 Ответ

0 голосов
/ 11 марта 2019

Я не очень знаком с VB, но я думаю, что он будет делать то же самое, что и они, используя winforms для C #

Самый простой способ убедиться, что все Одноразовые объекты AForm удаляется при удалении формы, чтобы сохранить коллекцию одноразовых объектов.Для этого вы можете использовать существующий класс Sytem.ComponentModel.Component .Недостатком является то, что он принимает только объекты, которые реализуют интерфейс IComponent .Если у вас есть только несколько классов, которые еще не имеют этого интерфейса, это самый простой метод.В противном случае создайте свой собственный DisposableCollection

class DisposableCollection : List<object>, IDisposable
{
     public bool IsDisposed {get, private set} = false;

     private IEnumerable<IDisposable> DisposableItems => this.OfType<IDisposable>();

     public void Dispose()
     {
         if (!this.IsDisposed)
         {
               // Dispose all disposable items
               foreach (IDisposable disposableItem in this.DisposableItems)
               {
                   disposableItem.Dispose();
               }
               this.disposed = true;
         }  
     }
}

Использование:

class MyForm : Form
{
     private readonly DisposableCollection disposables = new DisposableCollection();

     public MyForm()
     {
          // create and add all your items to disposables
     }

     protected override void OnDisposing(bool disposing)
     {
           this.disposables.Dispose();
     }
}

При желании вы можете добавить обработчики событий, чтобы уведомить других о том, что объект удаляется

...