Есть ли обходной путь для ToolStrip, чтобы не утечка памяти - PullRequest
0 голосов
/ 11 октября 2011

У меня есть простая форма (MainForm), которая открывает другую форму (SubForm), на которой есть ToolStrip.

В вызванной форме больше ничего нет. Форма вызова имеет только кнопку.

Память вызываемой формы никогда не восстанавливается, поскольку для SystemEvents.UserPreferenceChanged существует обработчик событий. Я прочитал, что это проблема, которая была исправлена ​​в .NET 3.5.1.

[ РЕДАКТИРОВАТЬ Приложение работает на 3.5.1, поэтому либо оно не исправлено, либо я делаю что-то другое]

Могу ли я сделать что-нибудь, чтобы сборщик мусора смог восстановить память подчиненной формы?

Как только я удаляю ToolStrip, подчиненная форма может снова собираться мусором.

MainForm

public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SubForm subForm = new SubForm();
            subForm.ShowDialog();
        }
    }

SubForm

 public partial class SubForm : Form
    {
        public SubForm()
        {
            InitializeComponent();
        }
    }

График хранения экземпляров с помощью Toolstrip

enter image description here

Большая версия

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

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

~SubForm()
{
  Console.WriteLine("Destroyed!");
}

Затем в коде, где вы создаете форму, после возврата ShowDialog, включите GC.Collect(), чтобы выполнить сборку мусора. Когда вы запускаете программу, если вы видите консольное сообщение, то все хорошо. В противном случае у вас есть утечка памяти, которая может быть вызвана утечкой памяти ToolStrip.

В этом случае вызовите Dispose() для ToolStrip в событии SubForm FormClosed и попробуйте снова. Это работает для меня, используя .Net 2, которая имеет проблему. Если вы запустите снова, вы должны получить консольное сообщение. Если вы этого не сделаете, у вас может быть другая утечка памяти (например, DateTimePicker)

1 голос
/ 11 октября 2011

Вы показываете диалоговое окно, но никогда не утилизируете его, поэтому, по крайней мере, поместите его в предложение using () или утилизируйте его, когда это необходимо. Подробнее о ShowDialog здесь

...