我正在开发一个包含ListView的WP 8.1应用程序。在每个ListView项目中都有一些文本和图片。这些图片来自Http GET请求,我必须绑定到xaml。我之前有一个解决方案,但我有一些性能问题。 ListView可以多次包含相同的图片,因此同一图片也会多次调用GetImage任务。在WiFi连接上,这不是一个大问题,但连接不良则是
我想要实现的另一件事是图像缓存。在应用运行时,我不知道哪里是存储图片的最佳位置。我应该存储大约10-40张图片,图像大小在3到20 KB之间。由于关闭应用程序后不需要这些图像,我想我可以将它们存储在内存中,而不是存储文件夹中
所以,我想要的是:一次下载每个图像并在应用程序运行时存储它们。
以下是我用来下载图片的代码:
public class WebPathToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value == null) return null;
return new TaskCompletionNotifier<BitmapImage>(GetImage((string)value));
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{ throw new NotImplementedException(); }
private async Task<BitmapImage> GetImage(string emailaddress)
{
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
Uri uri = new Uri((string)localSettings.Values["Server"] + "Image/Downloadavatar?EmailAddress=" + emailaddress + "&Size=NORMAL");
HttpClient webCLient = new HttpClient();
IInputStream responseStream = await webCLient.GetInputStreamAsync(uri);
MemoryStream memoryStream = new MemoryStream();
Stream stream = responseStream.AsStreamForRead();
await stream.CopyToAsync(memoryStream);
memoryStream.Position = 0;
BitmapImage bitmap = new BitmapImage();
await bitmap.SetSourceAsync(memoryStream.AsRandomAccessStream());
return bitmap;
}
}
答案 0 :(得分:2)
我问了一个关于如何使用缓存数据下载并同时执行它们的类似问题。 看看这里的答案:Task caching when performing Tasks in parallel with WhenAll
因此,简而言之,您的GetImage应该放在一个包含任务而不是结果的列表中。