uwp延迟加载图像源

时间:2017-04-01 10:44:22

标签: c# asynchronous uwp async-await deferred

一个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实现,但如果有更好的方法,我会徘徊。

谢谢!

1 个答案:

答案 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);
}