Утечка памяти с ContextMenuStrip

Я создаю много пользовательских элементов управления и добавляю их к FlowLayoutPanel. Существует также ContextMenuStrip, созданный и заполненный во время проектирования.

Каждый раз, когда управление добавляется к панели, этому присвоили ее свойство ContextMenuStrip этому меню, так, чтобы все средства управления "совместно использовали" то же меню. Но я заметил, когда средства управления удаляют из панели и избавляются, память, используемая в Диспетчере задач, не отбрасывает. Это повышается приблизительно на 50 КБ каждый раз, когда управление создается и добавляется к панели расположения.

Я загрузил суд над Профилировщиком Памяти.NET, и он показал, что были ссылки на полосу меню, бродящую вокруг после того, как средства управления были расположены. Я изменил код для явной установки свойства ContextMenuStrip в NULL перед избавлением от управления, и да, память теперь освобождена. Почему это? Разве GC не должен очищать этот тип вещи?

9
задан Henk Holterman 9 May 2010 в 10:30
поделиться

1 ответ

Если вы посмотрите на свойство ContexmenuStrip в Control, вы увидите, что сеттер подписывает элемент управления на событие Disposed в MenuStrip, создавая обратную ссылку от MenuStrip к Control.

Это означает, что это классический случай достижимого сквозного события, и вы уже нашли решение: установите свойство ContexmenuStrip в null.

6
ответ дан 4 December 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: