0

在我们的生产中,我的应用程序导致了两个不同的异常:

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 绘图。因此,我搜索了未释放图形句柄的代码-没有成功。

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

4

2 回答 2

1

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

但是您是否正在处理所有 Disposable 对象?刷子之类的。。

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

也许有一些刷子,......没有被丢弃。

于 2013-03-22T07:08:01.330 回答
1

检查您的代码并确保在不再需要时释放所有一次性物品。将一次性对象打包到 using 语句中。

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

于 2013-03-22T07:44:46.520 回答