用于长时间加载页面的策略是什么?

时间:2013-06-24 15:53:28

标签: wpf loading

尝试解决以下问题:

提供将在导航目标完成加载之前显示的进度指示器。导航的目标最多可能需要30秒才能加载,因为从互联网上的不同来源获取图像。

问题在于使用NavigationServicePage的事件处理此类任务,因为在页面加载其内容之前总是已提升,这是在Loaded事件内完成的。加载过程是异步的,不会阻止UI,因此无法移动到构造函数,因为它无法标记为异步。

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

1 个答案:

答案 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...
}

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