Команда, связывающая утечку памяти в WPF

Когда я создаю пользовательский элемент управления, который имеет CommandBinding к RoutedUICommand, я волнуюсь, что получаю утечки памяти.

сценарий:

Имейте RoutedUICommand как помехи в c классе, где я храню свои команды Implement CommandBindings на пользовательском элементе управления. Добавьте пользовательский элемент управления к основной форме. Удалите пользовательский элемент управления из основной формы, установите ссылки на него к пустому указателю.

canExecute привязки команды продолжает стрелять. У меня нет ссылки на UserControl так его пропущенный. и это продолжает стрелять в течение долгого времени после того, как форма закрывается. (я не видел, что он останавливается), Если я вызываю мусор, собираются, это собрано (хорошо, canExecute прекращает стрелять),

У меня есть тестовый проект, который иллюстрирует это. У меня есть Консоль. WriteLine в canExecute, который распечатывает хэш-код объекта, запускающего метод. Это имеет кнопку для добавления нового пользовательского элемента управления и один для удаления его.

Разве я не должен быть обеспокоен этим? пользовательский элемент управления действительно становится собранным, если вызвано. это означает, что будет собрано в следующем наборе? Я замечаю снижение производительности в нашем приложении и отслеживаю утечки памяти и т.д., мы усложнили формы с большим количеством ui элементов, и они бродят вокруг израсходования процессора и пространства памяти при удалении из расположения. (мы используем много команд), я думал, после того как что-то было удалено из визуального дерева, оно больше не могло получать направленные события. что я пропускаю?

6
задан Aran Mulholland 8 January 2010 в 05:40
поделиться

1 ответ

Насколько я понимаю, привязки команд используют нечто похожее (но не то же самое) на шаблон WeakEvent .

Обычно используется WeakReference . Это позволит ему работать после того, как ваша ссылка исчезнет, ​​но не предотвратит сбор вашего класса сборщиком мусора, когда на него больше ничего не ссылается.

Короче говоря, не волнуйтесь - он работает так, как должен работать.

2
ответ дан 17 December 2019 в 20:32
поделиться
Другие вопросы по тегам:

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