我发现很难解决很简单的任务:如何从远程服务器下载图像?
最简单的方法就是:
BitmapImage img = new BitmapImage(new Uri("http://myserv/test.jpg", UriKind.Absolute));
xamlImageContainer.Source = img;
但我认为这个解决方案并不理想,因为它可以阻止UI线程(可以吗?)。 所以我决定使用“异步”方法:
async void LoadImage()
{
xamlImageContainer.Source = await Task.Run(() =>
{
return new BitmapImage(new Uri("http://myserv/test.jpg", UriKind.Absolute));
});
}
但是在return new BitmapImage
行上我收到了UnauthorizedAccessException,其中说“无效的跨线程访问”!
这里有什么问题,请建议。
答案 0 :(得分:1)
BitmapImage
类型的对象只能在UI线程中创建。因此“无效的跨线程访问”。
但是,您可以将BitmapImage
的{{1}}属性设置为CreateOptions
。这样,图像就会在后台线程中下载和解码:
BackgroundCreation
答案 1 :(得分:1)
是的@anderZubi是对的。但是,如果要将后台线程中的内容加载到UI线程,CreateOptions是此问题的最佳解决方案。您需要调用Dispatcher。 Dispatcher.BeginInvoke(()=> YourMethodToUpdateUIElements());
这将在UI线程上调用该方法,您将不会获得AccessViolationException。
仅供参考。