一个UWP应用程序,一组视图模型被实例化并填充在页面的构造函数中。每个项目都有一个名为ImageSource
的{{1}}类型的属性,初始化为新的BitmapImage
。视图具有绑定到集合的网格视图。在视图中,为集合的项目定义了BitmapImage()
。特别是DataTemplate
会显示一个图像,其源与项目的属性DataTemplate
绑定。 ImageSource
还处理Image的事件,因此在图像仍在加载时显示占位符。
页面的已加载事件会触发所有图像源的下载:
DataTemplate
在此代码中,从慢速提供程序中检索 private async void Page_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
foreach (ImageViewModel imageViewModel in this.imageViewModels)
{
IRandomAccessStream randomAccessStream = await SlowImageSourceProvider.GetRandomAccessStream(imageViewModel.Id);
await imageViewModel.ImageSource.SetSourceAsync(randomAccessStream);
}
}
的实例,例如在慢速网络上侦听IRandomAccessStream
。
视图上的Image.Source绑定到上面代码的HttpClient
。以这种方式,每个图像需要等待前一个图像结束下载,然后再开始下载自己的源。
如何让所有图像一次开始下载,而不让它们等待其他图像?
我唯一的想法是创建一个懒惰的IRandomAccessStream实现,但如果有更好的方法,我会徘徊。
谢谢!
答案 0 :(得分:1)
图像一次只下载一个,因为在foreach
个语句完成之前await
不会再开始另一次迭代。要同时请求所有图像下载并等待它们异步完成,请尝试以下操作:
private async void Page_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) {
var setImageTasks = this.imageViewModels.Select(async imageViewModel => {
var randomAccessStream = await SlowImageSourceProvider.GetRandomAccessStream(imageViewModel.Id);
await imageViewModel.ImageSource.SetSourceAsync(randomAccessStream);
}).ToArray();
await Task.WhenAll(setImageTasks);
}