Просто откройте и закройте диалоговое окно winform увеличит использование памяти - PullRequest
9 голосов
/ 21 октября 2010

Я пытаюсь уменьшить использование памяти приложением winForm.

В приложении есть основная форма и форма настроек. При нажатии кнопки «Настройка» форма настройки будет отображаться в виде модальной формы. Форма настройки будет загружать данные app.config из файла конфигурации и считывать их в память как Hashtable. После закрытия формы настройки она вызовет метод Dispose, унаследованный от Windows.Forms.Form. Метод Dispose также прост, как и для объекта Hashtables и app.config значение null.

Показать SettingForm как модальную форму:

private void btnSettings_Click(object sender, EventArgs e)
    {
        frmConfig form = new frmConfig();
        form.StartPosition = FormStartPosition.CenterScreen;
        //MessageBox.Show(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase));
        form.ShowDialog(this);
        form.Dispose();
    }

Способ утилизации:

 protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
            // Release managed resources
            Logger.Verbose("Disposing SettingForm");
            mySetting = null;
            testFtp = null;
        }
        base.Dispose(disposing);
    }

Примечание: mySetting - это экземпляр Class, в котором все данные app.config были загружены в Hashtable, а testFtp - это пользовательский объект для функции ftp. Должен ли я реализовать метод Dispose для этих двух классов и использовать

mySetting.Dispose();
testFtp.Dispose(); 

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

Но каждый раз, нажимая кнопку «Настройка» и закрывая форму настройки, вы увеличиваете частный байт на несколько сотен килограмм. Утечка памяти? Как я мог избавиться от этого?

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

Как вы предложили ближе к концу вашего вопроса, я бы рекомендовал реализовать IDisposable на mySetting и testFtp.Вы должны увидеть лучшую очистку ресурсов после того, как вы реализовали следующее:

 protected override void Dispose(bool disposing) {
    if (disposing && (components != null)) {
       components.Dispose();

       // Release managed resources
       Logger.Verbose("Disposing SettingForm");
       mySetting.Dispose();
       testFtp.Dispose();
    }

    base.Dispose(disposing);
 }

Небольшое редактирование: на основе ответа Найана и ответа, на который он ссылается: я настоятельно рекомендую реализацию IDisposable.Использование Forms и вывод из класса Forms кричит: «Проверьте необходимость реализации IDisposable».Это не означает, что ваш код должен его реализовывать, просто вы должны действительно проверить, чтобы убедиться, что он вам не нужен.В формах обычно публикуются и подписываются многочисленные события.Формы также известны тем, что стали универсальным ресурсом, IMO.

1 голос
/ 21 октября 2010

Возможно, память не освобождается из-за какого-то другого фрагмента кода.Поскольку вы не предоставили много подробностей, сейчас я предположу, что все остальное оптимально.

Объекты, с которыми вы работаете, собираются сборщиком мусора (как вы это знаете).Но они не могут быть освобождены из памяти, когда вы этого хотите.Объекты .NET лучше оставить сборщику мусора.

По причине того, что память может не освобождаться, у вас есть ответы здесь.

Установка ссылки на объект на нольне имеет большого значения.С другой стороны, я лично несколько раз записывал, что объекты возвращаются живыми (и переносятся к старым поколениям), потому что вы используете их, устанавливая ноль в то же самое.Это еще одна форма вмешательства в GC, но ваш выбор.

Возможно, вам не нужно реализовывать IDisposable, но если вы работаете с потоками, дескрипторами ОС, неуправляемыми ресурсами, вам следует.

Редактировать:

Использование памяти может быть высоким, но GC несет ответственность за его освобождение до тех пор, пока вы не сохраните ссылки.Итак, если вы приняли все меры предосторожности, может показаться, что ваше приложение потребляет много памяти.Это приемлемо, поскольку освобождение объектов, на которые нет ссылок, является обязанностью сборщика мусора.

0 голосов
/ 22 октября 2010

Почему вы думаете, что это утечка?GC не обязан мгновенно освобождать память, при некоторых обстоятельствах он может вообще не выполнить сбор, и это будет нормально.

Если вам действительно необходимо немедленно освободить эти килобайты, вы можете заставить GC выполнить очисткутолько после утилизации, но в целом это дорогостоящая операция, которая может повлиять на общую производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...