在某些配置不同的机器(操作系统、显卡和内存)上,我得到了 OutOfMemory 异常。一些测试表明,消耗的虚拟内存没有显着增加。这是引发异常的代码段:
public override Size GetPreferredSize(Size proposedSize)
{
try
{
using (Graphics g = this.CreateGraphics())
{
SizeF measured = g.MeasureString(this.Text, this.Font); // <= OutOfMemoryException
measured += new SizeF(1, 1);
return measured.ToSize();
}
}
catch (OutOfMemoryException oom)
{
System.Diagnostics.Trace.WriteLine(oom.ToString());
}
return proposedSize;
}
该类直接从标签派生。
CreateGraphics() 调用 GDI+ 函数 GdipCreateFromHWND 在某些情况下可能会返回引发我面临的 OutOfMemoryException 的状态 (3):
[EditorBrowsable(EditorBrowsableState.Advanced), SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
public static Graphics FromHwndInternal(IntPtr hwnd)
{
IntPtr zero = IntPtr.Zero;
int status = SafeNativeMethods.Gdip.GdipCreateFromHWND(new HandleRef(null, hwnd), out zero);
if (status != 0)
{
throw SafeNativeMethods.Gdip.StatusException(status); // status = 3 throws an OutOfMemoryException with text "Out of memory"
}
return new Graphics(zero);
}
但不幸的是,当它返回 Out Of Memory 时,我还没有找到关于函数和案例的文档。
这个问题至少可以在一台客户机器上非常快速地重复。他所要做的就是单击一个按钮,该按钮创建一个新窗口,其中放置了一个派生标签,用于在 WebBrowser 控件中显示内容。
如果您有任何想法可以帮助我找到异常原因,那就太好了!
干杯,迈克尔