代码之家  ›  专栏  ›  技术社区  ›  Brandon

我的WPF导航中是否存在内存泄漏?

  •  6
  • Brandon  · 技术社区  · 16 年前

    因此,我转到对象保留图,看看是什么让它们保持不变,我在每一页上都看到了这一点:

    Object Retention Graph http://img683.imageshack.us/img683/3013/ants.jpg

    问题是,我在每个页面上都将KeepAlive设置为false,我认为用户控件上不存在这样的属性。

    2 回复  |  直到 16 年前
        1
  •  9
  •   Anvaka    16 年前

    是的,根据您提供的,您有内存泄漏。当您找到引用链,而它不在您的代码中时,最简单的方法是。。。反射器。

    图像显示: JournalEntryKeepAlive._keepAliveRoot 字段保存对对象的引用。让我们进入反射器,看看这家伙是如何被我们的物体吸引住的。

    NavigationService.MakeJournalEntry() 函数,然后 NavigationService.IsContentKeepAlive() . 这是:

    internal bool IsContentKeepAlive()
    {
        bool keepAlive = true;
        DependencyObject dependencyObject = this._bp as DependencyObject;
        if (dependencyObject != null)
        {
            keepAlive = JournalEntry.GetKeepAlive(dependencyObject);
            if (!keepAlive)
            {
                PageFunctionBase base2 = dependencyObject as PageFunctionBase;
                bool flag2 = !this.CanReloadFromUri;
                if ((base2 == null) && flag2)
                {
                    keepAlive = true;
                }
            }
        }
        return keepAlive;
    }
    

    • 附加的Property JournalEntry.KeepAlive为true;
    • 它不是PageFunction,不能从Uri重新加载。

    在这项调查之后,可能值得更多地阅读 JournalEntry.KeepAlive

    这个策略帮助我找到了许多与记忆有关的昆虫。希望它也能帮助你:)。

    干杯

        2
  •  6
  •   Emil    13 年前

    应用程序使用了 NavigationWindow 要承载一些WPF页面并使用此代码进行导航,请执行以下操作:

    NavigationService.Navigate( new Page1());
    

    这个问题是由日志保存在内存中的多个页面造成的,这些页面无法被垃圾收集。

    导航窗口 对于普通窗口,在窗口中包含UserControls和swap用户控件的页面就像页面一样。 在谷歌有很多这样做的例子。 NavigationService.Navigate

    推荐文章