В нашем приложении SL4, построенном на Caliburn.Micro, мы столкнулись с (еще одной) утечкой памяти.
Похоже, что проблема вызвана ItemsControl с пользовательским DataTemplate, связанным с коллекцией объектов IEnumerable, которые реализуют интерфейс INotifyPropertyChanged.
Когда исходная коллекция изменяется (другая коллекция назначается свойству ViewModel, к которому привязан ItemsSource элемента ItemsControl), объекты в исходной коллекции и связанные шаблоны данных не собираются сборщиком мусора. Хотя обработка событий NotifyPropertyChanged, по-видимому, выполняется внутренне через WeakReference, похоже, что SL сохраняет другую ссылку на эти объекты. Поэтому каждый раз, когда мы обновляем данные с сервера, потребление памяти увеличивается.
У вас есть идеи, как решить эту проблему?
Я действительно не могу понять, как такая ошибка может случиться в SL4!
Некоторые эксперименты предполагали, что вызов ItemsControl.Items.Clear () может помочь. Любой совет, как просто вызвать это каждый раз, когда изменяется ItemSource? Единственное, что мне приходит в голову, это переопределить ItemsSourceProperty и добавить туда обработчик.
EDIT:
Оказалось, что утечка происходит в этой ситуации:
- загрузка сущностей через контекст служб RIA и сохранение их коллекции в свойстве viewmodel
- привязать представление списка с пользовательским шаблоном данных к свойству с коллекцией объектов
- обновление объектов через контекст служб RIA
Что происходит, так это то, что хотя сущности обновляются, что видно на виде, потребление памяти растет.
Если привязка отсутствует, обновление сущностей не потребляет больше памяти (возможно, но уровень потребления памяти в конечном итоге возвращается обратно, когда GC выполняет свою работу).
Если вы очистите контекст или просто создадите новый, память также будет в конечном итоге собрана.
Похоже, проблема связана со службами RIA.
Я могу предоставить простой проект, который показывает проблему, если хотите.
ОБНОВЛЕНИЕ: Утечка памяти, кажется, вызвана INotifyDataErrorInfo. Читайте здесь .