Кэширование объектов GDI + в приложении winforms: стоит ли оно того и как это делать правильно?

Для некоторых из моих приложений winforms мне нужно создать целую кучу объектов GDI + (кисти, перья, шрифты и т. Д.) И использовать их снова и снова. Я создал кэширующий синглтон в гетто, чтобы выполнить то, что мне нужно, но запах кода ошеломляющий ...

public sealed class GraphicsPalette
{
    public static readonly GraphicsPalette Instance = new GraphicsPalette();

    static GraphicsPalette()
    {
    }

    private Dictionary<Color, Brush> solidBrushes;

    //multithreading
    private object brushLock;

    private GraphicsPalette()
    {
        solidBrushes = new Dictionary<Color, Brush>();

        brushLock = new object();
    }

    public Brush GetSolidBrush(Color color, int alpha)
    {
        return GetSolidBrush(Color.FromArgb(alpha, color));
    }

    public Brush GetSolidBrush(Color color)
    {
        if (!solidBrushes.ContainsKey(color))
        {
            lock (brushLock)
            {
                if (!solidBrushes.ContainsKey(color))
                {
                    Brush brush = new SolidBrush(color);
                    solidBrushes.Add(color, brush);
                    return brush;
                }
            }
        }
        return solidBrushes[color];
    }
}
  1. Есть ли для меня лучший способ повторно использовать эти объекты GDI +, а не создавать их каждый раз заново OnPaint () и т. Д.?
  2. Будут ли объекты GDI + вызывать неуправляемую утечку памяти после завершения программы, или будет вызван финализатор для каждого объекта Brush , который, в свою очередь, освободит все неуправляемые объекты. ресурсы?

Прошу прощения, если это повторение, но я не нашел подобных вопросов.

10
задан Repo Man 14 February 2012 в 23:03
поделиться