从 Uri 到 BitmapImage 的转换器有问题。Uri 是网络上图像的 url。我在列表框中的项目上使用此转换器。
我从网页下载图像并从此流 BitampImage 创建
问题是如果列表框包含大约 100 - 250 个项目,应用程序冻结,我尝试在另一个线程中调用 WebRequestMethod 但它不起作用。
这是代码的根部分:
private static BitmapImage GetImgFromAzet(int sex, Uri imgUri)
{
try
{
if (imgUri == null)
{
if (sex == (int)Sex.Man)
{
return new BitmapImage(new Uri(@"pack://application:,,,/Spirit;Component/images/DefaultAvatars/man.jpg",
UriKind.RelativeOrAbsolute));
}
else
{
return new BitmapImage(new Uri(@"pack://application:,,,/Spirit;Component/images/DefaultAvatars/woman.jpg",
UriKind.RelativeOrAbsolute));
}
}
else
{
BitmapImage image = null;
Task.Factory.StartNew(() =>
{
WebRequest webRequest = WebRequest.CreateDefault(imgUri);
webRequest.ContentType = "image/jpeg";
WebResponse webResponse = webRequest.GetResponse();
image = new BitmapImage();
image.CreateOptions = BitmapCreateOptions.None;
image.CacheOption = BitmapCacheOption.OnLoad;
image.BeginInit();
image.StreamSource = webResponse.GetResponseStream();
image.EndInit();
return image;
//((System.Action)(() =>
//{
// //webResponse.Close();
//})).OnUIThread();
});
return image;
}
}
catch (Exception)
{
//默认返回 new BitmapImage(new Uri(PokecUrl.Avatar,UriKind.RelativeOrAbsolute)); } }
我的目标是从网上下载图像,从他那里创建 BitamImage 对象并作为图像源控件返回,但我需要避免应用程序冻结。还有一个问题是如果我关闭 webResponse 它会破坏所有代码。
编辑:
我试试这个:
BitmapImage image;
WebRequest req = WebRequest.CreateDefault(imgUri);
req.ContentType = "image/jpeg";
using (var res = req.GetResponse())
{
image = new BitmapImage();
image.CreateOptions = BitmapCreateOptions.None;
image.CacheOption = BitmapCacheOption.OnLoad;
image.BeginInit();
image.UriSource = imgUri;
image.StreamSource = res.GetResponseStream();
image.EndInit();
}
但某处必须是错误,代码已损坏。
有什么建议吗?