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