应用背景
我们的平台是一个点击一次的 WPF 应用程序。我们有一个包含导航菜单结构的“shell”,它托管我们自己的自定义“页面”类。当您导航到新页面时,我们会(基本上)换掉 shell 的内容。
问题
所以,我为一家从事大型软件项目的公司工作。我们发现有很多代码存在内存问题。
问题是在我们的应用程序中有很多地方是事件是有线的而不是无线的。我不确定开发人员为什么要这样做,我猜他们希望每次用户导航到新的“页面”时都会清理对象。
我们没有重构每个页面的选项(在此版本中)。C# 有没有办法从对象中删除所有引用?(因此允许垃圾收集器将该对象连同它的所有内部引用一起丢弃)
我们正在尝试取回这些内存,但是当我们需要处理 WPF 时,要找到仍在引用我们的页面(对象引用)的对象是相当复杂的。
我们已经查看了可视化和逻辑树,并使用分析应用程序来帮助我们手动清理事物(为了证明这个想法),这也被证明是非常困难的。
我坐下来想,为什么我们要做所有这些工作来查找对象引用,我们不能在关闭时“取消引用”这个“页面”吗?
这把我带到了这里:)
非常感谢任何帮助!
更新 1
在评论中,有人问了以下问题:
问:应用程序。真的有记忆问题吗?这些是如何展示/检测的?还是在 GC2 发生之前这段记忆一直存在?– 米奇小麦
A:内存有问题。如果我们离开一个页面(保存页面的属性被设置为一个新对象),旧对象永远不会被垃圾收集器收集。所以记忆只是不断增长。如果我们公司重新开始,请使用此应用程序。我们应该看的第一件事是实现 WeakEvent 模式并在 WPF 中使用更多路由命令。
更新 2
我能够想出自己的解决方案。