Оптимизация BitmapImage коллекции

120
14 ноября 2020, 18:30

Разрабатываю проект, который должен читать из .zip архивов информацию (имя, описание, изображение). Для этой задачи я взял DotNetZip.

Сделал DTO класс:

class ENBModel
{
    public string Name { get; set; }
    public BitmapImage Image { get; set; }
}

Далее сделал некую коллекцию, в которую загружаю из всех найденных файлов данные, делаю это примерно так:

foreach (var file in files)
{
    using (var zip = ZipFile.Read(file))
    {
        var enb = new ENBModel();
        using (var dataStream = new MemoryStream())
        {
            var dataZip = zip["PSSData.json"];
            dataZip.Extract(dataStream);
            var data = Encoding.Default.GetString(dataStream.ToArray());
            var json = JsonConvert.DeserializeObject<FileDataModel>(data);
            enb.Name = json.Name;
        }
        var imageSource = new BitmapImage();
        using (MemoryStream imageSteam = new MemoryStream())
        {
            var imgZip = zip["Image.png"];
            imgZip.Extract(imageSteam);
            imageSource.BeginInit();
            imageSource.StreamSource = imageSteam;
            imageSource.CacheOption = BitmapCacheOption.OnLoad;
            imageSource.EndInit();
            enb.Image = imageSource;
        }
        Presets.Add(enb);
    }
}

В результате я имею все необходимое для вывода данных в View. Делаю это простым ListBox:

<ListBox ItemsSource="{Binding Presets}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

И после всех этих манипуляций я вижу, что у мое приложение кушает не 60мб RAM, а уже все 500. Я понимаю, да, идет хранение всех изображений в памяти, но как без этого быть?

Собственно, помогите это дело как то оптимизировать. Где бы я не находил про это информацию, везде совет "Поставьте CacheOption = BitmapCacheOption.OnLoad;", но как видим стоит и результата ноль. Пробовал другие варианты, так вовсе получаю серые изображения.

READ ALSO
Сравнение двух JSON (C#)

Сравнение двух JSON (C#)

Стоит такая задачаЕсть CSR(запросы на сертификаты)

134
Как хранить баланс пользователя в MySQL?

Как хранить баланс пользователя в MySQL?

Интересует, как хранить баланс пользователей в MySQL? Если во FLOAT, то он округляется и значения постоянно получаются неправильныеПробовал типы...

118
MySQL server has gone away (host vs ip)

MySQL server has gone away (host vs ip)

Тема мусолилась много еще с древних времен, когда на мамонтов ходили с копьями

106