C # Открыть форму из другой формы (слишком много памяти для обработки) - PullRequest
0 голосов
/ 19 ноября 2018

Я некоторое время искал способы открыть вторую форму из другой уже показанной формы.

Это некоторый фрагмент кода, который работает:

frmSecond second = new frmSecond();
this.Hide();
second.ShowDialog();
this.Close();

Что он делаетв основном это Hide() текущая открытая форма, затем она открывает другую форму (метод ShowDialog()).Close() скрытая в настоящий момент форма будет закрыта только тогда, когда только что созданная вами форма будет закрыта.

Проблема здесь в следующем: при таком способе создается огромный поток форм.Если мне нужно перейти с frmSecond на frmThird, он сохранит первую форму и frmSecond, выполняемую в фоновом режиме, при этом отображается только frmThird.

Тогда, когда frmThird открыто, если мне нужно вернуться к первой форме, я бы использовал некоторый код вроде:

frmFirst first = new frmFirst();
this.Hide();
first.ShowDialog();
this.Close();

И он создал бы еще frmFirst!Тогда у нас будет три формы, выполняемые в фоновом режиме (первая frmFirst, frmSecond и frmThird).

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

Есть ли альтернатива или дополнение, чтобы исправить эту проблему?

Если что-то неясно, пожалуйста, не дайте мне знать.Спасибо.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Чтобы освободить память, вам нужно избавиться от формы, используя метод Dispose, когда он больше не нужен.

0 голосов
/ 19 ноября 2018

Похоже, у вас здесь ошибка при проектировании

Тогда, когда откроется frmThird, если мне нужно вернуться к первому Форма, я бы использовал такой код, как:

frmFirst first = new frmFirst();
this.Hide();
first.ShowDialog();
this.Close();

Это оставит оригинал, созданный frmFirst в памяти, невидимым, ничего не делая, кроме как съедая память.
Если вы знаете, что хотите вернуться к frmFirst, который был создан ранее, почему бы просто не сделать это:

frmFirst.Show();

и сэкономит вам много памяти.

У вас есть 2 варианта на самом деле

  1. Скрыть формы и активировать их при необходимости
  2. Закройте и утилизируйте формы и при необходимости создайте их заново

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

0 голосов
/ 19 ноября 2018

Если вы хотите получить доступ к уже созданным формам, попробуйте использовать статическое свойство Application.OpenForms.Он содержит список всех форм, открытых в настоящее время в вашем приложении.Документация: здесь .

Например, если вы всегда хотите оставить frmFirst открытым, а затем вернуться к нему при закрытии другой формы, вы можете сделать это:

frmFirst existing = Application.OpenForms.OfType<frmFirst>().FirstOrDefault();
if (existing != null)
    existing.Show();

Вам нужно будет удалить свои this.Close() вызовы, чтобы это работало.

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