Утечка памяти привязки команд в WPF - PullRequest
6 голосов
/ 08 января 2010

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

сценарий:

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

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

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

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

1 Ответ

2 голосов
/ 08 января 2010

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

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

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

...