【问题标题】:Efficient way of reusing or disposing custom fonts in c#在 C# 中重用或处理自定义字体的有效方法
【发布时间】:2017-02-05 04:11:25
【问题描述】:

我们有 C# 表单应用程序,它使用大量控件和自定义字体,每个控件都有不同的大小。问题在于不断增长的 FONT gdi 对象计数,这会在重新创建控件时导致 OutOfMemory 异常(一旦超过 10,000 个计数 - 使用 Bear GDI 进行测试)。我尝试了以下选项,但字体 gdi 并不一致:

  1. 通过在静态类中将其声明为静态变量来重用特定字体类型/大小的每种字体

    静态字体 Robo_13Reg_Font= new Font("Roboto", 13F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(0)));

  2. 创建一个局部字体变量并在使用完成后释放

  3. 将标签中的字体重用到所需控件并处理标签,如下代码所示

 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


【解决方案1】:

检查您是否正在创建大量工具提示实例(新工具提示)并为应用程序中的工具提示分配字体 - 这也会为正在创建的每个工具提示实例创建字体 GDI 对象,因为我遇到了类似的问题。

【讨论】:

  • 谢谢这解决了我的问题。这是因为我与控件一起创建的工具提示实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多