Избавьтесь от Изображения в WPF в Поле списка (утечка памяти)

Desc и amp; trigger являются зарезервированными словами, поэтому их нельзя использовать в качестве имен столбцов, если вы не используете обратные метки. См. этот пост для дальнейшего объяснения.

Как только это будет решено, запрос SQL также будет неправильно отформатирован, поскольку имена столбцов не должны быть заключены в кавычки.

Используйте следующее в качестве руководства:

INSERT INTO command (`trigger`, `desc`) VALUES ('value', 'value');

5
задан Kris Erickson 21 March 2009 в 19:34
поделиться

2 ответа

Если Вы не делаете, что-либо необычное при загрузке изображений (как использование homebrewed отображают загрузчики или что-то), затем, GC должен вытереть их для Вас, когда ничто не ссылается на них больше.

Вы держитесь за ссылки на данные где-нибудь? Помните, что события и обработчики событий могут иногда "обманывать" сборщик "мусора" в размышление, что объект все еще используется:

MyObject obj = new MyObject();
obj.TheEvent += new EventHandler(MyHandler);
obj = null;
// Now you might think that obj is set for collection but it 
// (probably - I don't have access to MS' .NET source code) isn't 
// since we're still listening to events from it.

Не уверенный, если бы это относится к Вам, но по крайней мере это, были, я проверил бы на вашем месте.

Кроме того, если у Вас есть доступ к профилировщику, такому как AQTime или подобный, затем выполнение Вашего кода через него могло бы дать Вам некоторые подсказки.

Вы могли также попытаться видеть, имеет ли это какое-либо значение при загрузке изображений из диска или из ресурсов, встроенных в блок.

4
ответ дан 14 December 2019 в 04:51
поделиться

Как насчет того, чтобы не израсходовать всю ту память во-первых?

(Примечание: следующий параграф и код воспроизводятся из этого ответа.)

Часть проблемы - то, что она загружает полный образ в каждом. Необходимо использовать IValueConverter открыть каждое изображение в размере миниатюры путем установки любого DecodePixelWidth или DecodePixelHeight свойства на BitmapImage. Вот пример, который я использую в одном из моих проектов...

class PathToThumbnailConverter : IValueConverter {
    public int DecodeWidth {
        get;
        set;
    }

    public PathToThumbnailConverter() {
        DecodeWidth = 200;
    }

    public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture ) {
        var path = value as string;

        if ( !string.IsNullOrEmpty( path ) ) {

            FileInfo info = new FileInfo( path );

            if ( info.Exists && info.Length > 0 ) {
                BitmapImage bi = new BitmapImage();

                bi.BeginInit();
                bi.DecodePixelWidth = DecodeWidth;
                bi.CacheOption = BitmapCacheOption.OnLoad;
                bi.UriSource = new Uri( info.FullName );
                bi.EndInit();

                return bi;
            }
        }

        return null;
    }

    public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture ) {
        throw new NotImplementedException();
    }

}

Можно также хотеть рассмотреть IsAsync=True в Вашем Binding так, чтобы преобразователь назвали на фоновом потоке.

4
ответ дан 14 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: