【发布时间】:2016-05-02 15:24:09
【问题描述】:
我在基于 MVVM Light Toolkit 的 Windows WPF 应用程序中实现 INavigation。这是 NavigateTo 的实现:
private Frame GetFrame()
{
return (Application.Current.MainWindow as Generator.MainWindow).MainFrame; ;
}
public void NavigateTo(string pageKey)
{
CurrentPageKey = pageKey;
var obj = Activator.CreateInstance(_keyPageTypeMapping[pageKey]);
GetFrame()?.Navigate(obj);
}
当我导航到新页面时,会创建并显示新页面。但是,当我离开时,我没有看到旧页面的析构函数已被调用。即使经过 10-20 次导航,我也看不到它。我只看到在我退出应用程序后调用了析构函数。问题是处理旧页面的最佳方法是什么?
【问题讨论】:
-
您是指
Dispose还是finalizer?您需要处理它吗?需要处理的页面持有哪些资源? -
我想 Dispose,因为我不关心最终确定。只需要一些迹象表明对象没有保留在某处。资源主要是 UI 对象,但在内存中堆叠时可能会很昂贵。
-
除非您的表单使用非托管资源或实现
IDisposable的托管资源,否则您无需做任何事情,除了信任垃圾收集器完成其工作。它在需要时从内存中释放对象。 -
如果我正在创建 N 个页面,那么在应用程序退出时我应该看到调用 N 次析构函数吗? (考虑到我在应用程序生命周期内根本没有看到析构函数被调用)
-
你在看什么来确定? C# 中没有“析构函数”。类有一个终结器(除非它被覆盖,否则它不会做任何事情)并且可以实现 Dispose 模式。垃圾收集器并不总是在应用程序的生命周期内运行 - 它只会在存在内存压力时运行,并且会在应用程序不“忙”时尝试运行。 可能某些东西保留了对您的表单的引用而不是释放它,但您应该能够确定 - 查找保存对您的表单的引用的地方,看看它是否被适当地释放.