Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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#类实例化溢出 脚本_C#_Winforms_Exception_Devexpress - Fatal编程技术网

C#类实例化溢出 脚本

C#类实例化溢出 脚本,c#,winforms,exception,devexpress,C#,Winforms,Exception,Devexpress,我有一个C#Win Forms应用程序,其中主窗体包含一个循环,该循环创建另一个类(B类)的3000个实例。在表单B中,有大量的属性和字段,以及一系列进行大量处理的方法 问题: 创建3000个这样的类会给我带来问题吗?我在考虑内存异常?我已经有1或2个了,我也有一个例外,说的是类似于“某物爆炸了,这通常是其他地方内存损坏的迹象” 安装程序 我使用的是DevXpress Ribbon表单,但我没有对任何内容实施Dispose…我需要吗 非常感谢你的帮助 编辑-我从来没有说过3000个表单……我是说

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

问题: 创建3000个这样的类会给我带来问题吗?我在考虑内存异常?我已经有1或2个了,我也有一个例外,说的是类似于“某物爆炸了,这通常是其他地方内存损坏的迹象”

安装程序 我使用的是DevXpress Ribbon表单,但我没有对任何内容实施Dispose…我需要吗

非常感谢你的帮助


编辑-我从来没有说过3000个表单……我是说我有一个表单可以创建另一个类的3000个实例……尝试使用内存分析器运行应用程序,看看内存泄漏发生在哪里

http://memprofiler.com/

尝试使用内存探查器运行应用程序,并查看内存泄漏发生的位置

http://memprofiler.com/
你需要阅读。您将用完窗口外句柄,您确实需要实现并调用dispose,但正如本文所述,如果您必须询问这一点,您就做错了

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

我以前打过一次。我们有非常复杂的表单,当用户使用它们时,它们会被关闭,但是我们没有正确地处理它们。我们很快就达到了极限。这也让我们重新思考用户在一段时间内能够真正在大脑中处理的信息量,我们简化了表单

是我们的自动验收测试吸引了我们。他们浏览表单的速度比用户快,而且很快就达到了句柄限制

根据问题中的更改进行编辑

如果不是3000张表格,你就没事了。你仍然应该阅读链接,这是一件好事。但3000个实例并不多。即使他们每个都有1000个属性,你也应该很好。作为一个简单的检查,您可以在TaskManager中查看应用程序,以确保其正常运行

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

你需要阅读。您将用完窗口外句柄,您确实需要实现并调用dispose,但正如本文所述,如果您必须询问这一点,您就做错了

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

我以前打过一次。我们有非常复杂的表单,当用户使用它们时,它们会被关闭,但是我们没有正确地处理它们。我们很快就达到了极限。这也让我们重新思考用户在一段时间内能够真正在大脑中处理的信息量,我们简化了表单

是我们的自动验收测试吸引了我们。他们浏览表单的速度比用户快,而且很快就达到了句柄限制

根据问题中的更改进行编辑

如果不是3000张表格,你就没事了。你仍然应该阅读链接,这是一件好事。但3000个实例并不多。即使他们每个都有1000个属性,你也应该很好。作为一个简单的检查,您可以在TaskManager中查看应用程序,以确保其正常运行


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

3000个对象一般来说并不庞大,但必须质疑3000张表格的合理性

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


您还应该考虑重新分层应用程序,以便将处理逻辑与表单本身分离。这将使您在需要时更灵活地缩放处理层。有一个google for MVC/MVP作为起点。

3000个对象一般来说并不庞大,但必须质疑3000个表单的合理性

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


您还应该考虑重新分层应用程序,以便将处理逻辑与表单本身分离。这将使您在需要时更灵活地缩放处理层。让google for MVC/MVP作为起点。

我建议考虑flyweight模式: 这是专门为处理通常会创建大量对象的情况而设计的