当创建和销毁用户控件时,如何释放系统内存

3

我有一个C#应用程序,由各种屏幕组成,每个屏幕都是相应的用户控件。该应用程序需要在各种屏幕之间频繁切换,并且也需要大量的图形处理。每个控件在下一个控件被调用并调用垃圾收集器释放系统资源后被处理。问题是,由于某种原因,系统内存从未释放,在多次屏幕更改后,它最终崩溃。任何想法都将不胜感激。


如果您能发布一些示例代码,那会很有帮助。谢谢! - Mark Carpenter
1
我会为您添加处理方法的代码。我的初步猜测是事件没有被注销,因此您实际上没有处理用户控件。 - SwDevMan81
3个回答

2

如果我猜得对的话,你正在使用这些控件注册大量事件,但在它们被"销毁"之前没有进行注销,因此它们没有被GC回收。

这是一个非常复杂的主题。我强烈建议投资购买一个不错的内存分析器(花费一两百美元),以帮助你缩小应用程序崩溃的范围。


0

尝试使用内存分析器(例如ants),它会告诉您是什么使对象保持活动状态。试图猜测这种类型的问题非常困难。

Red-gate提供了14天的试用期,这应该足够时间来追踪此问题并决定内存分析器是否为您提供长期价值。

市场上有很多其他内存分析器(例如.NET Memory Profiler),其中大多数都有免费试用期,但我发现Red-Gate工具易于使用,因此首先尝试使用它们。


0

我觉得你没有释放所有的控件。可能是因为你忘记了释放其中一个,但一旦它不再使用,垃圾回收器仍然会将其清除。

更有可能的原因是循环引用,即两个控件彼此使用,从而保持对方活动。可能会有一整个控件循环使彼此保持活动状态,如果它们开始链接到更多的控件,系统迟早会耗尽所有资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接