Я создал приложение Prism с использованием WPF, .Net 4, Prism 4.1 и Unity. Я использую DirectoryModuleCatalog для поиска модулей во время выполнения. Мои представления отображаются в TabControl (MainRegion). Когда я удаляю представление из региона, view и viewmodel остаются в памяти и никогда не получают сбор мусора - tabitem удаляется. После многих часов поиска я не могу понять, что я делаю неправильно.WPF & Prism 4.1 Сбор мусора/проблемы с памятью
Вот мой Загрузчик:
public class Bootstrapper : UnityBootstrapper
{
protected override void InitializeShell()
{
base.InitializeShell();
App.Current.MainWindow = (Window)Shell;
App.Current.MainWindow.Show();
}
protected override DependencyObject CreateShell()
{
var shell = new Shell();
return shell;
}
protected override IModuleCatalog CreateModuleCatalog()
{
return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
}
}
Вот мой модуль:
[Module(ModuleName = "ModuleA")]
public class Module : IModule
{
private IRegionManager _regionManager;
public Module(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void Initialize()
{
var view = new UserControl1();
//_regionManager.RegisterViewWithRegion("MainRegion", typeof(UserControl1));
_regionManager.Regions["MainRegion"].Add(view, "ModuleA");
_regionManager.Regions["MainRegion"].Activate(view);
}
}
И Херес ViewModel для моей точки зрения, что будет добавлено в регионе:
public class ViewModel
{
public DelegateCommand RemoveView { get; set; }
public ViewModel()
{
RemoveView = new DelegateCommand(() =>
{
var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
var view = regionManager.Regions["MainRegion"].GetView("ModuleA");
regionManager.Regions["MainRegion"].Deactivate(view);
regionManager.Regions["MainRegion"].Remove(view);
});
}
}
И вот код сзади для представления:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
Я читал, что это может быть потому, что я создаю представление в модуле или, возможно, в viewmodel в представлении? Когда я использую Profiler Profiler Red Gate и удаляю представление через DelegateCommand, модель представления и viewmodel помечены как неспособные к сбору мусора. Где ссылка, которую я не правильно разрезаю?
Heres сохранение графика от Муравьев: https://docs.google.com/file/d/0B4XjO9pUQxBXbGFHS1luNUtyOTg/edit?usp=sharing
Вот test solution показывая вопрос.
Кроме того, я разместил вопрос на CodePlex.
Дикий удар в темноте: HTTP: // StackOverflow.com/questions/516617/what-is-the-weak-event-pattern-used-in-wpf-applications –
Эй, Крис. Я посмотрел на ваш проект. Похоже, ваш ViewModel реализует IDisposable. Я обнаружил, что это может иметь некоторые странные последствия для жизни, если Dispose() не вызывается (WPF, в отличие от WinForms, не очень использует IDisposable). IDisposable хорош для таких вещей, как закрытие неуправляемых ресурсов, таких как соединения с БД, и т. Д., Но для этого есть лучшие методы. Попробуйте взять его и посмотреть, что произойдет. –
Еще одна вещь, которую я должен упомянуть, заключается в том, что вы должны убедиться, что вы являетесь хорошим измерением на всю жизнь своего объекта. Коллекция не очень детерминирована, и я нашел в приложениях WPF, что иногда может потребоваться некоторое время для сбора объекта. Ваш график в ANT выглядит нормально - вещи, имеющие ссылки на вашу модель просмотра, выглядят так, что там где-то есть разрыв WeakReference, поэтому они не должны закреплять объект. –