Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于垃圾收集,是否有一种执行WPF/C对象解引用的好方法? 应用背景_C#_Memory Management_Pointers_Object_Object Reference - Fatal编程技术网

C# 对于垃圾收集,是否有一种执行WPF/C对象解引用的好方法? 应用背景

C# 对于垃圾收集,是否有一种执行WPF/C对象解引用的好方法? 应用背景,c#,memory-management,pointers,object,object-reference,C#,Memory Management,Pointers,Object,Object Reference,我们的平台是一个点击一次的WPF应用程序。我们有一个包含导航菜单结构的“shell”,它承载我们自己的自定义“页面”类。当您导航到一个新页面时,我们交换shell的内容(基本上) 问题 所以,我在一家公司工作,该公司正在进行一个非常大的软件项目。我们发现了很多内存问题的代码 问题是,在我们的应用程序中,有很多地方的事件是有线的,而不是非非有线的。我不确定开发人员为什么要这样做,我猜他们希望每次用户导航到新的“页面”时,对象都会被清理 我们没有重构每个页面的选项(在这个版本中)。C#有没有办法从对

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

问题 所以,我在一家公司工作,该公司正在进行一个非常大的软件项目。我们发现了很多内存问题的代码

问题是,在我们的应用程序中,有很多地方的事件是有线的,而不是非非有线的。我不确定开发人员为什么要这样做,我猜他们希望每次用户导航到新的“页面”时,对象都会被清理

我们没有重构每个页面的选项(在这个版本中)。C#有没有办法从对象中删除所有引用?(因此允许垃圾收集器丢弃该对象及其所有内部引用)

我们正试图找回内存,但当我们需要处理WPF时,发现对象仍在引用我们的页面(对象引用)是相当复杂的

我们已经查看了可视化和逻辑树,并使用分析应用程序帮助我们手动清理(为了证明这个想法),这也被证明是非常困难的

我坐下来想,为什么我们要做这些工作来寻找对象引用,难道我们不能在“页面”关闭时“取消引用”它吗

这让我想到这里:)
非常感谢您的帮助


更新1 评论中询问了以下问题:


Q:执行该应用程序。你真的有记忆问题吗?这些是如何展示/检测的?或者,在GC2发生之前,这种记忆会一直存在吗米奇小麦

A:它有内存问题。如果我们保留一个页面(保存该页面的属性被设置为一个新对象),那么垃圾收集器将永远不会收集旧对象。所以记忆一直在增长。如果我们公司重新开始,请使用此应用程序。我们首先应该考虑的是在WPF中实现事件模式和使用更多路由命令

更新2
我自己也能想到。

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

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

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

关于恐惧症的问题,您的应用程序使用了多少内存

编辑:

链接到CLR Profiler 2.0,它应该适用于.net3.5应用程序。

您是否使用了CLRProfiler?我发现这在查找对象和查找引用对象方面非常好

这个“如何”页面

。。。下载站点的链接

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

我实现了解决这个问题的方法

不幸的是,Microsoft建议您使用他们的VentManager作为基类,并为应用程序中的每个事件创建一个管理器类型!!!我试图编写一个继承自此基础的管理器,并使其更“通用”(而不是通用的C#术语)。此“通用”事件管理器不适用于Microsoft的基类。我必须从头开始编写一个事件管理器


感谢您对此问题提供的任何帮助

不支持该应用程序。你真的有记忆问题吗?这些是如何展示/检测的?或者,在GC2发生之前,这个内存是否一直存在?