gpt4 book ai didi

c# - 我应该处理 FontFamily.Families 结果吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:12 24 4
gpt4 key购买 nike

我是否应该在 System.Drawing.FontFamily.Families 属性中处理每种字体,这会返回一个实现 IDisposableFontFamily 类数组?

在极少数情况下,当它们由属性访问器返回时,我是否应该处置也实现了 IDisposable 的任何其他类实例或实例数组?

最佳答案

我查看了使用 Reflector 的代码,我可以告诉您,当您访问该属性时,正在使用 SafeNativeMethods.Gdip.GdipCloneFontFamily() 分配大量字体句柄。对于每种字体。

如果不是太难,你应该这样做。如果不这样做,终结器将释放为每种字体分配的操作系统句柄,但是如果有很多字体,您真的不想花很长时间来处理它们。在调用终结器之前可能需要任意长的时间。

如果您正在访问 Families[]重复属性,您最终可能会得到很多未发布的操作系统句柄,这可能会导致问题。

这是 FontFamily 的 Dispose() 方法输入:

private void Dispose(bool disposing)
{
if (this.nativeFamily != IntPtr.Zero)
{
try
{
SafeNativeMethods.Gdip.GdipDeleteFontFamily(new HandleRef(this, this.nativeFamily));
}
catch (Exception exception)
{
if (ClientUtils.IsCriticalException(exception))
{
throw;
}
}
finally
{
this.nativeFamily = IntPtr.Zero;
}
}
}

请注意,您会错过对 GdipDeleteFontFamily() 的调用这将释放底层操作系统句柄的字体。

(旁注:微软对这类事情的文档非常糟糕,因为他们的示例代码通常会忽略处理字体的问题。)

这是 Families 的实现:

public FontFamily[] Families
{
get
{
int numFound = 0x0;
int status = SafeNativeMethods.Gdip.GdipGetFontCollectionFamilyCount(new HandleRef(this, this.nativeFontCollection), out numFound);
if (status != 0x0)
{
throw SafeNativeMethods.Gdip.StatusException(status);
}
IntPtr[] gpfamilies = new IntPtr[numFound];
int num3 = 0x0;
status = SafeNativeMethods.Gdip.GdipGetFontCollectionFamilyList(new HandleRef(this, this.nativeFontCollection), numFound, gpfamilies, out num3);
if (status != 0x0)
{
throw SafeNativeMethods.Gdip.StatusException(status);
}
FontFamily[] familyArray = new FontFamily[num3];
for (int i = 0x0; i < num3; i++)
{
IntPtr ptr;
SafeNativeMethods.Gdip.GdipCloneFontFamily(new HandleRef(null, gpfamilies[i]), out ptr);
familyArray[i] = new FontFamily(ptr);
}
return familyArray;
}
}

注意它如何计算有多少字体,然后调用 GdipCloneFontFamily()对于每一个并初始化一个新的 FontFamily与返回的 IntPtr .

关于c# - 我应该处理 FontFamily.Families 结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22147422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com