试图解决以下问题:
提供一个进度指示器,直到导航目标完成加载。导航到的目标可能需要长达 30 秒的时间来加载,因为从 Internet 上的不同来源获取图像。
问题在于使用NavigationService或Page的事件处理此类任务,因为它们总是在 Page 加载其内容之前引发,这是在 Loaded 事件中完成的。加载过程是异步的,不会阻塞 UI,因此不能移动到构造函数,因为它不能标记为异步。
是否有解决此类问题的有效模式?
试图解决以下问题:
提供一个进度指示器,直到导航目标完成加载。导航到的目标可能需要长达 30 秒的时间来加载,因为从 Internet 上的不同来源获取图像。
问题在于使用NavigationService或Page的事件处理此类任务,因为它们总是在 Page 加载其内容之前引发,这是在 Loaded 事件中完成的。加载过程是异步的,不会阻塞 UI,因此不能移动到构造函数,因为它不能标记为异步。
是否有解决此类问题的有效模式?
这里的一个选择是让构造函数创建一个返回 a 的方法,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...
}
这允许整个链是异步的,构造函数仍在初始化数据的获取(因此它尽可能快地进入)。