2009-04-21 104 views
2

在Windows Vista高级版上安装我的程序后,出现以下异常。System.OutOfMemoryException:内存不足(GDI)

必须显示的视图包含以下控件:2个文本框,3个标签,一个按钮和一个链接按钮。

System.OutOfMemoryException: Out of memory. 
    at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc) 
    at System.Windows.Forms.PaintEventArgs.get_Graphics() 
    at System.Windows.Forms.Control.PaintException(PaintEventArgs e) 
    at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) 
    at System.Windows.Forms.Control.OnPrint(PaintEventArgs e) 
    at System.Windows.Forms.Control.WmPrintClient(Message& m) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
    at System.Windows.Forms.ContainerControl.WndProc(Message& m) 
    at System.Windows.Forms.Form.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

有人有同样的问题?如何解决它?

回答

3

您的应用程序是否使用您自己编写的任何自定义控件或控件?你能用一个非常简单的形式来重现这个问题吗?

这...

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/4bc34266-edf9-430c-ad5a-c6e29392eb2d

...这...

http://social.expression.microsoft.com/Forums/zh-CN/netfxbcl/thread/7c4d2e73-6e73-4f10-a614-13fd76b2f419

...似乎是一个类似的问题。然而,他们通常会谈论无法处理对象的自定义控件(并因此泄漏GDI处理)。

您的应用程序中的其他地方有可能泄漏手柄吗?

+0

我使用Telerik的RadGridView在我的其他形式。 其他然后我使用的控制.net – Gerbrand 2009-04-21 09:57:24

1

可能有可能您仅在Vista中检测到此项,因为可用内存少于Windows XP的可用内存?如果机器的规格大致相同,那么我会猜Vista的盒子会有更少的内存空间,因此会更快地突出内存泄漏的问题。

另一种可能是你试图渲染太多,因为调用堆栈指出有一个可滚动的控件,是否有可能渲染一堆实际上不可见的东西?

+0

我安装程序上的WIN XP专业版和业务(没有问题),在Vista终极也没有问题。但Vista Premium - >给我那个错误 – Gerbrand 2009-04-21 09:57:55

0

您多久一次显示此表单?这可能是窗口句柄(或缺少)的句柄问题。

我已经在包含带有数百个控件的对话框的项目上工作,并且由于对话框没有在使用后处置,所以存在内存/句柄问题。

为了解决这个问题,他们最初在窗体第一次显示时为每个控件存储了句柄,并且每次都重复使用它们。

在我看来,只要摧毁完成后不需要的东西,就会更容易,更简单。

+0

这个表格只显示一次,当程序启动时他们需要在进入实际程序之前输入登录名。我们重新启动了出现问题的计算机,现在程序启动时没有出现错误,我们可以在程序中工作。 – Gerbrand 2009-04-21 15:53:59

4

这不一定是一个OOM错误,GDI有抛出内存的习惯,只要它抛出一个异常。

引用微软“GDI +喜欢在与内存无关的情况下返回OutOfMemoryExceptions”。一个讨厌的小“特质”

here为可以显示细节