В нашем приложении SL4, построенном на Caliburn.Micro, мы столкнулись с (другой) утечкой памяти.Утечка памяти Silverlight 4 с помощью ItemsControl
Устранено, кажется, что проблема вызвана ItemControl с пользовательским DataTemplate, связанным с коллекцией объектов IEnumerable, которые реализуют интерфейс INotifyPropertyChanged.
Когда исходная коллекция изменена (другая коллекция назначена свойству ViewModel, к которому привязан ItemsSource ItemsControl), entites в исходной коллекции и связанных DataTemplates не собираются с мусором. Хотя обработка событий NotifyPropertyChanged, по-видимому, выполняется внутренне через WeakReference, похоже, что SL сохраняет другую ссылку на эти объекты. Поэтому каждый раз, когда мы обновляем данные с сервера, потребление памяти увеличивается.
У вас есть вопросы, как решить эту проблему? Я действительно не могу понять, как эта ошибка может произойти в SL4!
Некоторые эксперименты предполагали, что вызов ItemsControl.Items.Clear() может помочь. Любой совет, как просто называть это каждый раз при изменении ItemsSource? Единственное, что приходит мне на ум, это переопределить ItemsSourceProperty и добавить туда обработчика.
EDIT: Оказалось, что утечка происходит в этой ситуации:
- нагрузки лиц через контекст RIA услуг и хранить коллекцию из них в собственности ViewModel
- связать ListView с пользовательскими данными шаблон собственности с коллекцией entites
- обновить entites через контекст РИА услуги
что происходит, что Altho В то время как объекты становятся обновленными, что можно увидеть в представлении, потребление памяти растет.
Если нет привязки, обновление объектов не потребляет больше памяти (возможно, но уровень потребления памяти в конечном итоге возвращается обратно, когда GC выполняет свою работу).
Если вы очистите контекст или просто создадите новый, то также будет собрана память.
Похоже, что проблема связана с услугами RIA.
Я могу предоставить простой проект, который показывает проблему, если вы хотите.
ОБНОВЛЕНИЕ: утечка памяти, по-видимому, вызвана INotifyDataErrorInfo. Прочтите here.
Спасибо, что предупредили меня об этой проблеме! Вы знаете, если это происходит в WPF? –
Пока нет. Но я постараюсь подготовить простое демо для WPF и SL, чтобы воспроизвести проблему, чтобы мы увидели. У тебя та же проблема? До сих пор кажется, что даже RIA может каким-то образом повлиять на проблему ... – gius
Просто для подтверждения: вы тестируете это в режиме деблокирования без приставки отладчика, правильно? –