Когда я создаю пользовательский элемент управления, который имеет CommandBinding к RoutedUICommand, я волнуюсь, что получаю утечки памяти.
сценарий:
Имейте RoutedUICommand как помехи в c классе, где я храню свои команды Implement CommandBindings на пользовательском элементе управления. Добавьте пользовательский элемент управления к основной форме. Удалите пользовательский элемент управления из основной формы, установите ссылки на него к пустому указателю.
canExecute привязки команды продолжает стрелять. У меня нет ссылки на UserControl так его пропущенный. и это продолжает стрелять в течение долгого времени после того, как форма закрывается. (я не видел, что он останавливается), Если я вызываю мусор, собираются, это собрано (хорошо, canExecute прекращает стрелять),
У меня есть тестовый проект, который иллюстрирует это. У меня есть Консоль. WriteLine в canExecute, который распечатывает хэш-код объекта, запускающего метод. Это имеет кнопку для добавления нового пользовательского элемента управления и один для удаления его.
Разве я не должен быть обеспокоен этим? пользовательский элемент управления действительно становится собранным, если вызвано. это означает, что будет собрано в следующем наборе? Я замечаю снижение производительности в нашем приложении и отслеживаю утечки памяти и т.д., мы усложнили формы с большим количеством ui элементов, и они бродят вокруг израсходования процессора и пространства памяти при удалении из расположения. (мы используем много команд), я думал, после того как что-то было удалено из визуального дерева, оно больше не могло получать направленные события. что я пропускаю?
Насколько я понимаю, привязки команд используют нечто похожее (но не то же самое) на шаблон WeakEvent .
Обычно используется WeakReference . Это позволит ему работать после того, как ваша ссылка исчезнет, но не предотвратит сбор вашего класса сборщиком мусора, когда на него больше ничего не ссылается.
Короче говоря, не волнуйтесь - он работает так, как должен работать.