尝试解决以下问题:
提供将在导航目标完成加载之前显示的进度指示器。导航的目标最多可能需要30秒才能加载,因为从互联网上的不同来源获取图像。
问题在于使用NavigationService或Page的事件处理此类任务,因为在页面加载其内容之前总是已提升,这是在Loaded事件内完成的。加载过程是异步的,不会阻止UI,因此无法移动到构造函数,因为它无法标记为异步。
是否有解决此类问题的有效模式?
答案 0 :(得分:3)
此处的一个选项是让构造函数创建一个返回Task<T>
的方法,然后将其存储在类成员中。
然后,您的Loaded
事件可以在创建的任务上使用await
来提取数据并以异步方式显示它。
这看起来像是:
Task<YourData> initialDataLoadTask;
// In your constructor:
YourPage()
{
this.InitializeComponent();
// Use async method here to fetch data, but do NOT use await
this.initialDataLoadTask = FetchDataAsync();
this.Loaded += this.OnLoaded;
}
private async void OnLoaded(object sender, RoutedEventArgs e)
{
// Use await to pull out the data asynchronously now...
var data = await this.initialDataLoadTask;
// Display data as needed...
}
这允许整个链是异步的,构造函数仍然初始化数据的获取(因此它尽可能快地进入)。