Как повысить производительность при частом использовании растровых изображений в c#? - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь сделать проверку изображений. В основном это проверяет, что большое изображение (обычно изменяется) содержит img (никогда не изменяется) или нет. Итак, чтобы улучшить производительность, я ищу способ сохранить это изображение в памяти, чтобы я не go на диск c каждый раз для него.

Bitmap img = Accord.Imaging.Image.FromFile(@"D:\img.png");

Есть ли что-то хорошее решение для этого? Синглтон-модель хороший выбор для меня? Есть примеры выполнения?

EDIT-1: проект WPF.

Спасибо за совет!

1 Ответ

1 голос
/ 04 апреля 2020

По сути, было бы лучше избегать использования статических / одноэлементных паттернов (как всегда, лучше избегать их использования). Вы можете написать репозиторий с этим битмапом, загруженным при создании, и затем сохранить его на каком-то более высоком уровне классов, которые вы используете. Но иногда это хороший способ проверить синглтон :) Вот базовый c потокобезопасный шаблон синглтона (с растровым изображением внутри):

class Singleton
{
    public Bitmap Image { get; set; }

    private Singleton() { }

    private static Singleton _instance;

    private static readonly object _lock = new object();

    public static Singleton GetInstance(Bitmap value = null)
    {
        if (_instance == null)
        {
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = new Singleton();
                    if (value != null)
                    {
                      _instance.Image = value;
                    }
                }
            }
        }
        return _instance;
    }     
}

(взято с одной из лучших страниц в разработке программного обеспечения) фрагменты: https://refactoring.guru/design-patterns/singleton/csharp/example#example -1 )

Тогда ваша первая загрузка будет:

var  singleton = Singleton.GetInstance(Accord.Imaging.Image.FromFile(@"D:\img.png"));

И каждая следующая:

var image = Singleton.GetInstance().Image;
...