【问题标题】:Page life cycle页面生命周期
【发布时间】: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 模式。垃圾收集器并不总是在应用程序的生命周期内运行 - 它只会在存在内存压力时运行,并且会在应用程序不“忙”时尝试运行。 可能某些东西保留了对您的表单的引用而不是释放它,但您应该能够确定 - 查找保存对您的表单的引用的地方,看看它是否被适当地释放.

标签: c# wpf xaml mvvm


【解决方案1】:

你正在做的应该没问题。如果垃圾收集器尚未处理页面,则还没有必要这样做。如果您担心这些旧页面是否可以被垃圾收集,或者您只是想强制进行收集。尝试使用以下命令显式调用垃圾收集器:

GC.Collect();

【讨论】:

  • GC.Collect() 没有强制销毁对象。我有一些猜测,由于导航生态系统,这些对象并没有真正被处理掉。在我的窗口顶部出现了一个 IE7 风格的导航,带有后退/前进。纽扣。可能框架需要他们活着?在没有单一处置标志的情况下创建这么多新对象让我感到困扰......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2011-07-03
相关资源
最近更新 更多