Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

C# Забивается оперативная память

#c_sharp #wpf


Я загружаю изображения 240 штук в ListBox. 
Но у меня этот процесс отнимает 1600 мб оперативной памяти и я никак не могу освободить
эту память. Другие программы, как к примеру Nvidia Geforce Experience показывает все
картинки и оперативную память больше 10-15 мб не занимает

Каким образом можно реализовать показ картинок в папке?

Разметка Xaml


    
        
            
        
    
    
        
            
                
                    
                        
                            
                        
                        
                            
                        
                    
                
            
        
    



Логика C#

//Загружаем все изображения
private void Screenshots_LoadAll()
{
    string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
                + @"\GTA San Andreas User Files\SAMP\screens";

    var dirs = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories)
                        .Where(s => s.EndsWith(".png") || s.EndsWith(".jpg"));
    foreach (string dir in dirs)
    {
        ListBox_Screenshots.Items.Add(new ImageScreen() { imgSource = dir });
    }
    //Запускаем функцию на ожидание создания или удаления файлов
    Screenshots_StartWatch(path);
}

//Смотрим на создание или удаления файла
private void Screenshots_StartWatch(string path)
{
    FileSystemWatcher watch = new FileSystemWatcher();
    watch.Path = path;
    watch.Created += new FileSystemEventHandler(Screenshots_OnCreated);
    watch.Deleted += new FileSystemEventHandler(Screenshots_OnDeleted);
    watch.EnableRaisingEvents = true;

    bIsScreenshotsWatching = true;
}


public class ImageScreen :IDisposable
{
    public string imgSource { get; set; }

    public void Dispose()
    {
        imgSource = null;
    }
}

    


Ответы

Ответ 1



Для того чтобы не заморачиваться с созданием миниатюр, сначала рекомендую попробовать воспользоваться штатными средствами WPF. Класс BitmapImage имеет ряд свойств предназначенных для этого, в частности DecodePixelWidth и DecodePixelHeight Например, добавление одной строчки: Позволило снизить потребление ОЗУ на стандартных обоинах Windows 7 с ~440 до ~95 МБ, причем приложение вообще без картинок занимает ~65 МБ. До: После:

Комментариев нет:

Отправить комментарий