System.OutofMemory异常

时间:2012-09-27 04:56:43

标签: c# winforms

我有一个UI,winform,它有大量的控件,如tabcontrols,大量的文本框(最小25个跨标签)comboxes,复选框,按钮,标签,树控件等。

这些控件中的大多数都注册了ctrl事件,如textchanged,click等... 因为我得到了这个内存不足的例外而我所有的查询都很少:

问题:

  1. 在表单的dispose函数中应该配置每个这个ctrl吗?
  2. 如果事件所包含的事件如textchanged,click事件等在dispose函数中取消注册吗?由于代码片段已添加到设计器中,GC是否负责注册为ctrls添加的事件?
  3. 一些信息: 该应用程序在2GB ram机器上进行了长达100次迭代的稳定性测试。每次迭代都会执行相同的测试(启动对话框,执行一些点击或编辑某些值,然后关闭)。它运行了将近8小时。在第45次或第46次迭代中,它抛出了这个例外。是的,对话框中的所有控件都有一个事件或其他已注册的事件。一些文字改变了一些checkedchanged或点击等

1 个答案:

答案 0 :(得分:1)

我认为这里没有足够的信息告诉你到底发生了什么。这将需要您仔细分析代码,但首先要做的是通过内存分析器运行您的应用程序。例如,ANTS Memory Profiler,但实际上您可以访问的任何内容都可以正常运行,以查看实际情况。

通常情况下,你不会需要来明确处理每个控件,但是如果你订阅了事件,这会导致事情在内存中比平时更长时间处理。 This question具有血腥的细节,但简而言之,您想要取消订阅或使用弱引用来解决这个问题;无需枚举所有表单控件并调用Dispose。如果我记得,它应该在Form.Close()上调用,除非它是MDI表单,并且在调用Close时它不可见。

您还应该查看您正在存储的数据以及如何正确处理您的应用程序可能使用的任何资源。

如果你在32位系统上运行,你可能也会在每个进程内存限制2GB的情况下运行,如果你保持List周围增长到1GB并且必须调整大小。

所以,用探查器武装自己并进行调查。 :)