C#类实例化溢出

时间:2010-03-24 08:26:36

标签: c# winforms exception devexpress

方案

我有一个C#Win Forms应用程序,其中主窗体包含一个循环,创建另一个CLASS(CLASS B)的3000个实例。在表单B中,有大量的属性和字段以及一堆执行大量处理的方法。

问题

这些课程中有3000个会不会给我带来麻烦?我正在考虑内存异常的问题?我已经有过1或2,而且我也有一个例外,它说的是“有些东西爆炸,这通常是其他地方腐败记忆的迹象”。

设置

我正在使用DevExpress功能表,我没有在任何事情上实现Dispose ......我需要吗?

非常感谢。

编辑 - 我从不打算说3000 FORMS .....我想说我有一个单独的表格可以创建另一个类的3000个实例.....

4 个答案:

答案 0 :(得分:4)

一般来说,3000个物体并不大,但必须质疑3000种形态的完整性。

假设您没有同时向用户显示这些内容,因此更好的方法可能是根据用户的要求打开表单的实例,并使用方法DisplayData(..)填充表单,其中包含所需的数据记录。用户不太可能同时打开3000! 3-5会更合理。

您还应该考虑重新分层您的应用,以便将处理逻辑与表单本身分开。如果需要,这将为您提供更大的灵活性来扩展处理层。有一个谷歌MVC / MVP作为首发。

答案 1 :(得分:1)

尝试使用Memory Profilers运行您的应用程序,并查看发生内存泄漏的位置..

http://memprofiler.com/

答案 2 :(得分:1)

您需要阅读this article。你将耗尽窗口句柄,你需要实现并调用dispose,但正如文章所述,如果你不得不问这个问题你做错了。

Windows窗体中的每个控件都有一个唯一的窗口句柄。正如文章所指出的,每个进程都有10000个句柄。通过调用dispose释放句柄,因此您需要确保您的表单调用处理其子控件。大多数容器控件都会为您处理该部件,但需要仔细检查。记住它是每个控件,文本框都是。

我曾经打过这个。我们有非常复杂的表单,当用户完成它们时会关闭,但我们没有正确处理它们。我们匆忙达到了手柄限制。它还使我们重新思考用户一次可以真正精神处理的信息量,并简化了表格。

我们的自动验收测试引起了我们的注意。他们比用户更快地浏览表单并匆忙达到句柄限制。

编辑回应问题的变化

如果它不是3000表格你应该没事。您仍然应该阅读链接,这是一件好事。但3000个实例并不多。即使他们每人都拥有1000个属性,你也应该没问题。作为一个简单的检查,您可以在任务管理器中查看应用程序以确保它没问题。

一般来说,你需要实现IDisposable并在你的类引用窗口句柄,文件,数据库连接等内容时调用它。我不知道你的3000个实例在做什么所以我不能在这种情况下,如果您需要IDisposable,请告诉您。

答案 3 :(得分:0)

我建议考虑flyweight模式:http://en.wikipedia.org/wiki/Flyweight_pattern 这是专门设计用于处理通常会创建大量对象的情况,而是在实际需要时动态创建实例 flyweight的一个示例是使用集合类(如字典)来存储需要持久保存的对象的所有属性,当需要与特定对象进行交互时,flyweight会拉出属性并创建对象动态,一旦完成,属性就会存储回集合并释放对象引用。