Пару недель назад у меня возникли проблемы с утечками памяти, связанными с ContextMenuStrip. Эта проблема была исправлена. See that question hereУтечка памяти, снова!
Теперь у меня возникают аналогичные проблемы с элементами управления ToolStrip. Как и в предыдущей проблеме, я создаю большое количество UserControls и добавляю их в FlowLayoutPanel. Каждый элемент управления создает ToolStrip для себя в своем конструкторе. Когда элемент управления удаляется из FlowLayoutPanel (единственная ссылка на элемент управления), кажется, что память ToolStrip не освобождается.
Однако, когда я комментирую код, который создает ToolStrip, утечки памяти не происходит.
Это такая же проблема, как и предыдущая - мне нужно установить ToolStrip в значение null? Я не понимаю, как это могло произойти с этого момента, когда элемент управления сам создает полосу, и все события кнопки и т. Д. Обрабатываются внутри него. Итак, не все ли должно быть GC'd, когда элемент управления больше не ссылается?
EDIT: Что касается комментариев, то, что я не понимаю, изначально я был «сделать» свой собственный ToolStrip из панели и некоторых лейблов. Этикетки использовались в качестве кнопок. Таким образом, утечки памяти не происходили.
Единственное, что я изменил, это использование правильной ToolStrip с правильными кнопками вместо панели, но все обработчики событий подключены одинаково. Так почему же это сейчас утечка памяти?
EDIT2: Я как раз собирался опубликовать свой код, но перечитал вопрос, с которым связан Дэйв. Оказывается, это была проблема UserPreferenceChangedEvent ToolStrip. Если я установил свойство ToolStrip.Visible в false, утечки памяти не произойдет!
Теперь, могу ли я сделать это в методе Dispose? Если да, то как? Я попытался скопировать какой-то код, но получаю предупреждение о компиляции: «MyToolStrip.Dispose()« скрывает унаследованный элемент ». System.ComponentModel.Component.Dispose()« Я просто не понимаю интерфейс IDisposable.
В 95% случаев вы регистрируете обработчики событий и не отменяете их регистрацию при очистке коллекции элементов управления. Это будет первое место, где я смотрю. – Juliet
не уверен, что этот вопрос помогает, но тем не менее я нашел его интересным: http://stackoverflow.com/questions/620733/memory-leak-in-c – Dave