我建立使用WPF,.NET 4中,棱鏡4.1和團結棱鏡應用。我正在使用DirectoryModuleCatalog在運行時查找模塊。我的視圖顯示在TabControl(MainRegion)中。當我從區域刪除一個視圖,該視圖和視圖模型保留在內存中,從不垃圾收集 - 在TabItem的被刪除。經過許多小時的搜索,我無法弄清楚我做錯了什麼。WPF和棱鏡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);
}
}
而且繼承人是被添加到該地區我看來,視圖模型:
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();
}
}
我讀過,這可能是因爲我在實例化視圖中的模塊,或者也許是視圖模型視圖?當我使用紅門內存分析器,並且經由DelegateCommand,視圖和視圖模型去除視圖都標記爲不能夠被垃圾收集。我沒有正確裁剪的參考在哪裏?
繼承人從螞蟻的保留圖:https://docs.google.com/file/d/0B4XjO9pUQxBXbGFHS1luNUtyOTg/edit?usp=sharing
這裏的顯示問題進行test solution。
另外,我貼在CodePlex的問題也是如此。
野生刺在黑暗中:HTTP://計算器。COM /問題/ 516617 /什麼 - 是最微弱的事件圖案使用功能於WPF應用 – 2013-02-24 06:26:41
嘿,克里斯。我看着你的項目。它看起來像你的ViewModel實現IDisposable。我發現如果Dispose()沒有被調用(WPF,與WinForms不同,不會使用IDisposable),這可能會對生命週期產生一些奇怪的影響。 IDisposable適用於像關閉數據庫連接等非託管資源,但有更好的方法。試着拿出來看看會發生什麼。 – 2013-02-28 18:15:58
我應該提到的另一件事是,你應該確保你是一個很好的衡量你的對象的一生。集合不是非常確定的,我在WPF應用程序中發現它有時可能需要一段時間才能收集對象。你的螞蟻圖形看起來不錯 - 有你的視圖模型引用的東西都看向在那裏有一個WeakReference的休息的地方,所以他們不應該被釘扎的對象。 – 2013-02-28 18:18:37