WinForms手柄太多了

时间:2013-03-22 07:04:23

标签: c# windows handle system.drawing

我的制作,我的申请引起了两个不同的例外:

System.ArgumentException: Invalid Parameter.
   at System.Drawing.Image.get_RawFormat()
   at System.Windows.Forms.ToolStripItem.set_Image(Image value)
   at Zeiss.IMT.IME.CmmUI.Tools.ToolControl.updateControls()

还有另外一个例外,我想有相同的原因:

System.ComponentModel.Win32Exception: The operation completed successfully
   at System.Drawing.BufferedGraphicsContext.CreateCompatibleDIB(IntPtr hdc, IntPtr hpal, Int32 ulWidth, Int32 ulHeight, IntPtr& ppvBits)
   at System.Drawing.BufferedGraphicsContext.CreateBuffer(IntPtr src, Int32 offsetX, Int32 offsetY, Int32 width, Int32 height)
   at System.Drawing.BufferedGraphicsContext.AllocBuffer(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)
   at System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)
   at System.Drawing.BufferedGraphicsContext.Allocate(IntPtr targetDC, Rectangle targetRectangle)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.DataGridView.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)

在两个例外情况下,Windows任务管理器都会显示很多句柄(> 8500)。因此达到了窗口句柄限制,应用程序无法分配更多内存/句柄 到目前为止,我理解这个问题 在这种情况下,我通过System.Drawing大量使用GDI绘图。所以我搜索了我的代码,其中图形句柄没有被释放 - 没有成功。

所以问题是:
我怎样才能找到未发布的(原生)句柄???

2 个答案:

答案 0 :(得分:1)

您可以使用内存配置文件工具。例如,这一个:http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/

但是你处理所有Disposable对象了吗?刷子等......

您可以发布您的绘图代码,也许我们可以看到错误。

也许有一些刷子,......没有被处理掉。

答案 1 :(得分:1)

检查您的代码并确保在不再需要时释放所有一次性物品。将一次性物品装入使用声明中。

如果真的需要这么多GDI句柄,你可以增加最大http://msdn.microsoft.com/en-us/library/windows/desktop/ms724291(v=vs.85).aspx