Почему память увеличивается после закрытия формы?

Я новичок в С#. Я читал, что закрытие формы вместо сокрытия может освободить память. Однако, когда я закрыл форму, она даже увеличила память. Если быть точным, у меня есть две формы: Form1 и Form2. Когда я успешно войду в систему, откроется Form2 (память 20 МБ). Form2 есть кнопка для выхода пользователя из системы, закройте ее и вернитесь к Form1 (память теперь увеличивается до 41 МБ и продолжает увеличиваться для следующего пользователя). Я не знаю, почему, кто-нибудь может мне помочь? Это мой код для close Form2:

private void doctorLogoutBtn_Click(object sender, EventArgs e)
{
    imgBox.Image.Dispose();
    this.Dispose();
    Form1 Login = new Form1();
    Login.Show();
    this.Close();   
}

person Tin Chip    schedule 29.09.2017    source источник
comment
после закрытия вы также можете попробовать избавиться, вызвав метод Dispose   -  person Ehsan Sajjad    schedule 29.09.2017
comment
Вы не возвращаетесь к Form1, вы создаете новую Form1.   -  person Fildor    schedule 29.09.2017
comment
Как вы видите выше, я уже позвонил Dispose перед закрытием.   -  person Tin Chip    schedule 29.09.2017
comment
Память также увеличилась, когда вы не создали новый Form1?   -  person Mixxiphoid    schedule 29.09.2017
comment
Я предполагаю, что вам нужен какой-то UIManager, который хранит экземпляр каждой формы Form1 и Form2, которые вы показываете/скрываете как соответствующие.   -  person Fildor    schedule 29.09.2017
comment
Вместо того, чтобы создавать новую форму каждый раз, когда вы нажимаете кнопку, не могли бы вы выделить одну форму заранее, предпочтительно ту, которую вы никогда не уничтожаете, и просто использовать ее, когда вам нужен объект Form1?   -  person Clearer    schedule 29.09.2017
comment
Если вы создали Form2 в Form1, может возникнуть утечка ссылок, поэтому сборщик мусора не соберет первую форму Form1. То же самое для Form2. Таким образом, каждый пинг-понг будет выделять больше памяти, но память не будет освобождена.   -  person Fildor    schedule 29.09.2017
comment
Как вы сказали, моя проблема заключается в создании new form вместо вызова старого. Вот почему память всегда увеличивается. Я исправил это уже. Спасибо за вашу помощь!   -  person Tin Chip    schedule 02.10.2017


Ответы (2)


Это должно быть что-то вроде этого:

using System.Linq;

...

private void doctorLogoutBtn_Click(object sender, EventArgs e)
{
    // Free image resources (may appear to be optional, but doesn't spoil anything) 
    imgBox.Image.Dispose();

    // Do we have any Form1 instances?
    Form1 Login = Application
      .OpenForms
      .OfType<Form1>()
      .LastOrDefault(); // If we have several Form1's, let's take the last one

    // Only when we haven't any Form1 instances we have to create a new one
    if (null == Login) 
      Login = new Form1(); 

    Login.Show();

    // Close (and Dispose) 
    this.Close();   
}

В вашем текущем коде

...
Form1 Login = new Form1();
Login.Show();
...

вы создаете еще один экземпляр Form1, не ища уже созданных.

person Dmitry Bychenko    schedule 29.09.2017
comment
Это отличный ответ! Большое спасибо за большую помощь. - person Tin Chip; 02.10.2017

Что ж, судя по вашему описанию, вы хотите вернуться к Form1, который уже был создан, но из этого короткого фрагмента кода я вижу, что вы создаете новую форму.

Form1 Login = new Form1();

Выпущен ли старый Form1, когда вы показываете Form2? Может старая не правильно выпущена? Обесцвеченная часть кода об этом не говорит.

это слишком мало кода, который вы показываете, чтобы быть уверенным, но вы можете запустить профилировщик памяти (dotMemory, ANTS Memory) и проверить, остались ли какие-то объекты, которых не должно быть.

person Paweł Łukasik    schedule 29.09.2017
comment
Моя проблема заключается в создании новой формы вместо вызова старой. Вот почему память всегда увеличивается. Я исправил это уже. Спасибо за вашу помощь! - person Tin Chip; 02.10.2017