var client = new WebClient();
var bytes = client.DownloadData(webUrl); <-- NOT null
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
BitmapImage img = new BitmapImage();
img.BeginInit();
img.StreamSource = new MemoryStream(bytes); <-- null
img.EndInit();
img_DownloadCompleted(img, webUrl);
}));
Вышеупомянутый код выполнен в потоке, чтобы избежать блокировки пользовательского интерфейса.Переменная из закрывающего блока становится пустой в анонимной функции
Я пытаюсь загрузить изображение из Интернета в объект BitmapImage
. Изображение загружается правильно, но когда я пытаюсь использовать его в своем пользовательском интерфейсе (используя Dispatcher.Invoke
), я получаю это сообщение об ошибке: The calling thread cannot access this object because a different thread owns it.
Итак, я добавил код, который создает изображение в потоке пользовательского интерфейса. Но теперь, когда код достигает линии, указанной <-- null
, переменная bytes
внезапно стала нулевой. Он не равен нулю, прежде чем выполнение переходит к анонимной функции. (Я проверил с отладчиком)
Кто-нибудь знает, почему это так? Google не очень помогает.
Изменение типа переменной bytes
на var
не имеет значения.
Сниппет не дает никакого намека вообще. Вернитесь к исходному подходу, не забудьте вызвать метод Freeze() BitmapImage, чтобы больше не получить это исключение. –
Спасибо! img.Freeze() после img.EndInit() действительно исправляет основную проблему. – Jan