Bezdepbonusu7Программирование: статьи и ответы

Вопрос

WPF BitmapFrame и несколько потоков

Автор вопроса: MarkОтветов: 3

У меня есть файл PNG, хранящийся в моем облаке в хранилище больших двоичных объектов, я хочу загрузить его и отобразить на экране в WPF.

Я знаю о Диспетчере и Замораживании, но ничего не работает. Я продолжаю получать сообщение об ошибке "другой поток владеет им".

Вот что у меня есть:

var decoder = GetDecoder("http://address/image.png");

Dispatcher.Invoke(DispatcherPriority.Send, new Action<BitmapFrame>(SetImage), decoder.Frames[0]);

public void SetImage(BitmapFrame source)
{
    var bitmapFrame = BitmapFrame.Create(source);  //ERROR HERE!!!!!!!!
    LazyImage.Source = bitmapFrame;
}

private BitmapDecoder GetDecoder(object uri)
{
    var extension = System.IO.Path.GetExtension((string)uri);
    BitmapDecoder decoder = null;
    if (extension.ToLower() == ".png")
        decoder = BitmapDecoder.Create(new Uri((string)uri, UriKind.Absolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    return decoder;
}

Если я попытаюсь заморозить Frame[0], я получу исключение, говорящее, что этот Frame не может быть заморожен. Кроме того, декодер, возвращаемый BitmapDecoder.Create, является не PngBitmapDecoder, а LateBoundBitmapDecoder, который я действительно не знаю, как эффективно использовать.

multithreadingwpfbitmap

Ответы

Ответ 1 · рейтинг 1 · Lugoues

Возможно, вам нужно не только создать Bitmapframe в диспетчере, но и BitmapDecoder? Вы пытались вызвать GetDecoder в диспетчере?

Ответ 2 · рейтинг 3 · bohdan_trotsenko

Вкратце: попробуйте обернуть результат в WriteableBitmap.

Длинная история с кодом.

Ответ 3 · рейтинг 1 · Artfunkel

Это проблема и сегодня! Обертка данных в WriteableBitmap, как предложил Богдан, будет работать, но этот тип имеет передний и задний буфер, что удваивает его объем памяти. CachedBitmap - лучший выбор.

new CachedBitmap(bitmapSource, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);

Используйте BitmapCacheOption.OnLoad, если вам не нравятся сюрпризы, и не забудьте также заморозить получившийся объект.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы