Разрабатываю проект, который должен читать из .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;", но как видим стоит и результата ноль. Пробовал другие варианты, так вовсе получаю серые изображения.
Продвижение своими сайтами как стратегия роста и независимости