在windows vista premium上安装我的程序后,我遇到以下异常。
必须显示的视图包含以下控件: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)
有人有同样的问题吗?怎么解决?
答案 0 :(得分:4)
这不一定是OOM错误,GDI习惯在抛出异常时抛出内存。
引用微软“GDI +喜欢在与内存无关的情况下返回OutOfMemoryExceptions”。一个讨厌的小'特质'
有关详细信息,请参阅here
答案 1 :(得分:3)
您的应用是否使用了您自己编写的任何自定义控件或控件?你能用一个非常简单的形式重新解决这个问题吗?
此...
......而这......
......似乎是一个类似的问题。但是,他们通常会讨论无法处置对象的自定义控件(因此,GDI会泄漏处理)。
你的app中的其他地方是否有可能泄漏处理?
答案 2 :(得分:1)
你可能只在Vista上检测到这个,因为可用内存少于Windows XP盒子上的可用内存吗?如果机器的规格大致相同,那么我猜想Vista盒子的内存可以更少,因此可以更快地突出显示内存泄漏的问题。
另一种可能性是你试图渲染太多,因为调用堆栈声明有一个可滚动的控件,你是否有可能渲染出一堆实际上看不到的东西?
答案 3 :(得分:0)
您多久都会显示此表单?它可能是窗口句柄(或缺少)的句柄问题。
我参与过包含数百个控件的对话框的项目,并且由于对话框在使用后没有处置,因此存在内存/句柄问题。
要解决这个问题,他们最初会在表单第一次显示时为表单上的每个控件存储句柄,并且每次都会重复使用它们。
在我看来,只要你完成就摧毁你不需要的东西会更容易和更简单。