gpt4 book ai didi

c# - 为什么我的 window 没有收集垃圾?

转载 作者:行者123 更新时间:2023-12-04 13:04:27 25 4
gpt4 key购买 nike

我有一个标准的 CRUD 应用程序,可以处理大量数据。不同的窗口使用 Linq-To-SQL 访问不同的表,每个窗口本质上都有一个网格,其中的单元格绑定(bind)到我正在显示的对象。

这是一个非常标准的用例,说明正在发生的事情:

  1. 打开窗口 A
  2. 关闭窗口 A - 窗口 A 现在仍在内存中但不再可见。
  3. 打开窗口 B
  4. 关闭窗口 B - Windows A 和 B 现在都在内存中并且都不可见。
  5. 打开窗口 C
  6. 当为窗口 C 检索数据时,为窗口 A 释放资源。

因此,在任何给定时间,我的内存中都有 2-3 个窗口,而我真正应该拥有的只有一个。我什至在这些窗口的关闭事件中添加了处置代码,这些代码将我能想到的所有引用都设置为 null。

我尝试使用 ANTS 内存分析器,我注意到每个窗口都设置为 GC 根。有没有办法禁用此行为或以某种方式强制 GC 从这些窗口收集数据?

谢谢!

PS:我查了this link它并没有解决问题。

编辑:问题是用户收到 System.OutOfMemoryExceptions。

最佳答案

我通过两次更新解决了这个问题。首先,我在我的子窗口上使用 Telerik 控件。 Telerik 控件必须跟踪根视觉对象,因此如果它们仅在子窗口上实例化,则在每次实例化时它们都假定子窗口是根视觉对象并为其分配静态引用。通过在我的主应用程序窗口上实例化一个 telerik 控件,该窗口被设置为静态引用中的根视觉对象。

我做的第二个更新是将每个子窗口的所有者指定为我的主应用程序窗口。执行此操作并进行分析后,我发现子窗口不再被设置为 GC 根。

现在,只要为另一个窗口请求新内存,我的子窗口就会在关闭后自动进行垃圾收集。

关于c# - 为什么我的 window 没有收集垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4789263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com