【发布时间】:2017-02-05 04:11:25
【问题描述】:
我们有 C# 表单应用程序,它使用大量控件和自定义字体,每个控件都有不同的大小。问题在于不断增长的 FONT gdi 对象计数,这会在重新创建控件时导致 OutOfMemory 异常(一旦超过 10,000 个计数 - 使用 Bear GDI 进行测试)。我尝试了以下选项,但字体 gdi 并不一致:
-
通过在静态类中将其声明为静态变量来重用特定字体类型/大小的每种字体
静态字体 Robo_13Reg_Font= new Font("Roboto", 13F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(0)));
创建一个局部字体变量并在使用完成后释放
- 将标签中的字体重用到所需控件并处理标签,如下代码所示
public static void getRobo_13Reg_Font(Control addFontTo)
{
try
{
if (Robo_13Reg_Font == null)
{
Robo_13Reg_Font = new Label();
Robo_13Reg_Font.Font = new Font("Roboto", 13F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(0)));
}
addFontTo.Font = Robo_13Reg_Font.Font;
Robo_13Reg_Font.Dispose();
Robo_13Reg_Font = null;
}
finally
{
}
}
感谢您的所有投入!
【问题讨论】:
-
不是为每个控件创建一个新的
Font实例,您可以将字体缓存在一个以字体大小为键的字典中吗?这样一来,每种尺寸只有一个实例。 -
你能解释一下这将如何解决这个问题,因为我已经尝试过使用静态变量来保存字体对象的类似方法。
-
正如@BradleyUffner 所发现的,OOM 可能是因为您一次又一次地创建相同的字体而没有处理以前的字体。选项 1 似乎还可以,我不确定 "font gdi doesn't保持一致" 是什么意思。
-
好吧,当然不要将字体添加到控件并丢弃它。那么控件就会有一个disposed objects,不好的事情就可能发生。
-
public partial class Form1 : Form { static Font Robo_13Reg_Font = new Font("Roboto", 13F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(0))); public Form1() { InitializeComponent(); Label ctrl1 = new Label(); ctrl1.Font = Robo_13Reg_Font; Label ctrl2 = new Label(); ctrl2.Font = Robo_13Reg_Font; } }当我运行上述代码并检查时,字体 gdi 计数始终显示为 3,无论我声明为静态/本地范围。我们如何避免这种情况?
标签: c# .net winforms c#-4.0 dispose