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

对于垃圾回收,是否有一种好的方法来执行WPF/C#对象去引用?

  •  4
  • Phobis  · 技术社区  · 17 年前

    我们的平台是一个点击一次的WPF应用程序。我们有一个包含导航菜单结构的“shell”,它承载着我们自己的自定义“页面”类。当你导航到一个新页面时,我们交换掉shell的内容(本质上)。

    问题

    我们研究了视觉和逻辑树,并使用分析应用程序来帮助我们手动清理东西(以证明这个想法),这也被证明是极其困难的。

    这让我来到这里:)


    更新1

    A.

    solution .

    3 回复  |  直到 9 年前
        1
  •  1
  •   Martin Peck    17 年前

    这个“如何”页面。..

    http://msdn.microsoft.com/en-us/library/ms979205.aspx

    …下载网站的链接。

    然而,我认为你的问题的答案是“否”。没有一种方法可以说“不再需要对象foo——请收集它,不管它是否有根”。收集一个根对象可能会给你的应用程序带来各种不良影响。

        2
  •  1
  •   Phobis    17 年前

    我实施了 WeakEvents 为了解决这个问题。

    不幸的是,Microsoft建议您使用他们的WeakEventManager作为基类,并为应用程序中的每个事件创建一个管理器类型!!!我试图编写一个继承自这个基础的管理器,并使其更“通用”(不是C#中通用的术语)。这种“通用”事件管理器在微软的基类中是不可能的。我不得不从头开始写一个活动经理。

        3
  •  -1
  •   Glorfindel Doug L.    5 年前

    如果一个漏洞页面超出范围,包括所有底层数据,GC将收集它。最终。但是,如果该页面被仍在范围内的任何内容引用,则该页面及其所有数据将保留在内存中,GC将无法收集它。

    据我所知,在修复糟糕的内存管理方面没有简单的按钮。在我看来,这意味着唯一的办法就是清理参考文献。这将使GC更容易收集超出范围的对象。

    你可以建议GC检查它的算法,看看是否可以通过调用GC来收集任何东西。Collect()。然而,除非数据确实超出范围,否则除了浪费CPU周期外,这几乎没有什么作用。

    Phobis的问题,你的应用程序使用了多少内存?

    编辑:

    链接到CLR Profiler 2.0,它应该适用于.net3.5应用程序。 https://github.com/MicrosoftArchive/clrprofiler