在我们的生产中,我的应用程序导致了两个不同的异常:
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)。因此达到了 Windows 句柄限制,应用程序无法分配更多内存/句柄。
到目前为止,我明白了这个问题。
在这种情况下,我通过 System.Drawing 大量使用 GDI 绘图。因此,我搜索了未释放图形句柄的代码-没有成功。
所以问题是:
我怎样才能找到未发布的(本机)句柄???