WPF/BackgroundWorker и проблема BitmapSource

Я - новичок с WPF и попыткой домашнего проекта познакомиться с технологией. У меня есть простая форма, где пользователь выбирает файл изображения, я затем отображаю данные EXIF наряду с миниатюрой изображения. Это хорошо работает, но когда я выбираю НЕОБРАБОТАННЫЙ файл изображения (~9 МБ), там может быть небольшая задержка, в то время как ползунок загружается, таким образом, я думал, что мог использовать BackgroundWorker для декодирования изображения, и пользователь может просмотреть данные EXIF, затем когда изображение декодировалось, это отображено.

Объект BitmapSource объявляется в методе BackgroundWorkers DoWork:

worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
    string filePath = args.Argument as string;

    BitmapDecoder bmpDecoder = BitmapDecoder.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.None);
    BitmapSource bmpSource = bmpDecoder.Frames[0];
    bmpSource.Freeze(); //As suggested by Paul Betts

    args.Result = bmpSource;
};

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

worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
    imgThumb.Source = args.Result as BitmapSource;
};

Я пытался использовать imgThumb.Dispatcher.BeginInvoke() метод для установки источника, но это не работало также, я предполагаю, что это - потому что это args.Result это принадлежит другому потоку, а не imgThumb? Как я могу обойти это?

Могло случиться так, что я кодировал своего Диспетчера неправильно (следующее из памяти, я удалил то, что я имел).

imgThumb.Dispatcher.Invoke(new Action<BitmapSource>(
    delegate(BitmapSource src)
    {
        imgThumb.Source = src;
    }
), bmpSource);

Любые предложения или идеи приветствуются.

Обновление

Измененный мой метод DoWork для использования BitmapCreateOptions. Ни один, а не.DelayCreation, но теперь я получаю следующую ошибку при загрузке НЕОБРАБОТАННЫХ файлов (файлы Canon.CR2 все, что я протестировал до настоящего времени), код хорошо работает для jpg's. Это могло быть проблемой с Кодеком Canon, который я установил, чтобы позволить мне отображать НЕОБРАБОТАННЫЕ файлы?

Приложение назвало интерфейс, который был упорядочен для другого потока. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

5
задан Fermin 24 January 2010 в 21:27
поделиться

1 ответ

Вызов Freeze () на Bitmapsource, и у вас не будет этой проблемы (замораживание избавляется от ограничений на резьбу, но делает объект неизменным)

8
ответ дан 13 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

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