1

试图解决以下问题:

提供一个进度指示器,直到导航目标完成加载。导航到的目标可能需要长达 30 秒的时间来加载,因为从 Internet 上的不同来源获取图像。

问题在于使用NavigationServicePage的事件处理此类任务,因为它们总是在 Page 加载其内容之前引发,这是在 Loaded 事件中完成的。加载过程是异步的,不会阻塞 UI,因此不能移动到构造函数,因为它不能标记为异步。

是否有解决此类问题的有效模式?

4

1 回答 1

3

这里的一个选择是让构造函数创建一个返回 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...
}

这允许整个链是异步的,构造函数仍在初始化数据的获取(因此它尽可能快地进入)。

于 2013-06-24T16:01:32.937 回答