Загрузите BitmapImage, используя Task Parallel Library - PullRequest
1 голос
/ 29 марта 2011

Загрузка BitmapImage из URI в потоке пользовательского интерфейса приводит к зависанию приложения.Чтобы избежать этого, я пытаюсь загрузить BitmapImage в отдельном потоке, хотелось бы знать, можно ли сделать это простым с помощью TPL.

Мой текущий метод следующий:

            Task.Factory.StartNew<BitmapImage>(() => new BitmapImage(myUri) { CacheOption = BitmapCacheOption.OnLoad }, CancellationToken.None, TaskCreationOptions.None, new StaTaskScheduler(1))
        .ContinueWith(t => image1.Source = t.Result, TaskScheduler.FromCurrentSynchronizationContext());

Проблема с этим, конечно, в том, что BitmapImage не был создан в том же потоке, что и изображение.

Загруженный из URI BitmapImage не может быть заморожен, поэтому он не будет работать нормально.

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

Есть ли способ сделать код маленьким (э) и (более) читаемым при попытке отобразить изображение из Интернета?

1 Ответ

2 голосов
/ 29 марта 2011

Если изображение находится в файле XAML, и для его загрузки используется привязка, установите для IsAsync значение true, чтобы загрузить его асинхронно.

Конечно, тогда хорошей практикой является предоставление запасного заполнителя до того, как изображение появится. Один из способов сделать это - использовать PriorityBinding.

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

...