2013-10-09 3 views
0

Мне было трудно решить довольно простую задачу: как скачать изображение с моего удаленного сервера?Правильный способ загрузки изображения Windows Phone 8

Самый простой способ сделать это просто:

BitmapImage img = new BitmapImage(new Uri("http://myserv/test.jpg", UriKind.Absolute)); 
xamlImageContainer.Source = img; 

, но я думаю, что это решение не является идеальным, так как он может блокировать поток пользовательского интерфейса (может?). Поэтому я решил использовать «асинхронный» подход:

async void LoadImage() 
{ 
    xamlImageContainer.Source = await Task.Run(() => 
    { 
     return new BitmapImage(new Uri("http://myserv/test.jpg", UriKind.Absolute)); 
    }); 
} 

Но на линии return new BitmapImage я UnauthorizedAccessException, который говорит «недействительный доступ кросс-нить»! Что здесь не так, пожалуйста, предложите.

ответ

1

Объекты категории BitmapImage могут быть скомпонованы только в нитке пользовательского интерфейса. Следовательно, «недопустимый сквозной доступ».

Тем не менее, вы можете установить CreateOptions собственности на BackgroundCreation. Таким образом, изображение загружается и декодируется в фоновом потоке:

img.CreateOptions = BitmapCreateOptions.BackgroundCreation; 
+0

Я принял ваш ответ, потому что он работал. BitmapImage создает некоторые фоновые потоки внутри, когда используется так? –

+1

Видимо, да. См. Документацию здесь: http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.windows.media.imaging.bitmapcreateoptions(v=vs.105).aspx – anderZubi

1

Да @anderZubi является правильным. CreateOptions - лучшее решение для этой проблемы, однако, если вы хотите загрузить что-то из фонового потока в поток пользовательского интерфейса. Вам нужно вызвать диспетчера. Dispatcher.BeginInvoke (() => YourMethodToUpdateUIElements());

Это вызовет метод в потоке пользовательского интерфейса, и вы не получите AccessViolationException.

Просто FYI.

Смежные вопросы