0

私たちのプロダクションでは、私のアプリケーションは2つの異なる例外を引き起こしました:

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 描画を多用しています。それで、グラフィックハンドルが解放されていないコードを検索しました-成功しませんでした。

問題は次のとおりです。
リリースされていない (ネイティブの) ハンドルを見つけるにはどうすればよいですか?

4

2 に答える 2

1

メモリ プロファイル ツールを使用できます。たとえば、これ: http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/

しかし、すべての使い捨てオブジェクトを処分していますか? ブラシなど..

描画コードを投稿していただければ、何か問題がある可能性があります。

おそらくいくつかのブラシがあります...それらは破棄されません。

于 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 に答える