У меня есть долгоживущий ViewModel и динамический вид, который добавляется в визуальное дерево всякий раз, когда пользователь хочет видеть ViewModel. Когда пользователь закрывает представление, он удаляется из визуального дерева. Я намеренно поставил 50Мб фиктивных данных в представлении (UserControl):MVVM-WPF: динамический вид и утечка памяти?
private byte[] data = new byte[50 * 1024 * 1024];
Я наблюдал память проводника процесса взмывает вверх, когда я добавляю Посмотреть на визуальном дереве. Я закрыл View (выгружает его из визуального дерева), а затем явно называется Garbage собирать метод:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Однако память не снижается, и каждый раз, когда я добавить View на визуальное дерево, другой 50mb является добавлено. Я уверен, что мой ViewModel не ссылается на представление.
Любые предложения по решению этой проблемы или объясните мне, почему это так?
Спасибо!
РЕДАКТИРОВАТЬ:
Я использовал профилировщик памяти dotTrace и обнаружил, что нет никакой ссылки из ViewModel. Все ссылки на переменную «данные» являются объектами пользовательского интерфейса. Большая часть из них - из шаблона. Как правильно решить эту проблему?
Есть ли код для представления, который присоединяется к событию ViewModel или другого объекта без интерфейса? – aqwert
nope. Только нормальные привязки данных. – icube
Я бы предложил использовать профилировщик .NET памяти, если это возможно для вас. Он должен дать вам прямой ответ на то, что заставляет его не собираться. – Dror