c# – WinRT – 在保持UI响应的同时加载数据

前端之家收集整理的这篇文章主要介绍了c# – WinRT – 在保持UI响应的同时加载数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个 Windows Metro应用程序,并且我遇到了一个UI无法响应的问题.据我所知,原因如下:
  1. <ListView
  2. ...
  3. SelectionChanged="ItemListView_SelectionChanged"
  4. ...

此事件在此处理:

  1. async void ItemListView_SelectionChanged(object sender,SelectionChangedEventArgs e)
  2. {
  3. if (this.UsingLogicalPageNavigation()) this.InvalidateVisualState();
  4.  
  5. MyDataItem dataItem = e.AddedItems[0] as MyDataItem;
  6. await LoadMyPage(dataItem);
  7. }
  8.  
  9. private async Task LoadMyPage(MyDataItem dataItem)
  10. {
  11. SyndicationClient client = new SyndicationClient();
  12. SyndicationFeed Feed = await client.RetrieveFeedAsync(new Uri(Feed_URI));
  13.  
  14. string html = ConvertRSSToHtml(Feed)
  15. myWebView.NavigateToString(html,true);
  16. }

LoadMyPage需要一段时间才能完成,因为它从Web服务获取数据并将其加载到屏幕上.然而,看起来UI正在等待它:我的猜测是,直到上述事件完成.

所以我的问题是:我能做些什么呢?有没有更好的事件我可以挂钩,还是有其他方法来处理这个?我考虑过开始一个后台任务,但这对我来说似乎有些过分.

编辑:

只是为了澄清这个问题的规模,我说的是最多3到4秒没有反应.这绝不是一项长期工作.

编辑:

我已经尝试了下面的一些建议,但是,来自SelectionChanged函数的整个调用堆栈正在使用async / await.我已经跟踪了这句话:

  1. myFeed = await client.RetrieveFeedAsync(uri);

在完成之前似乎没有继续处理.

编辑:

我意识到这正在变成战争&和平,但下面是使用空白的地铁应用程序和按钮复制问题:

XAML:

  1. <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
  2. <StackPanel>
  3. <Button Click="Button_Click_1" Width="200" Height="200">test</Button>
  4. <TextBlock x:Name="test"/>
  5. </StackPanel>
  6. </Grid>

代码背后:

  1. private async void Button_Click_1(object sender,RoutedEventArgs e)
  2. {
  3. SyndicationFeed Feed = null;
  4.  
  5. SyndicationClient client = new SyndicationClient();
  6. Uri FeedUri = new Uri(myUri);
  7.  
  8. try
  9. {
  10. Feed = await client.RetrieveFeedAsync(FeedUri);
  11.  
  12. foreach (var item in Feed.Items)
  13. {
  14. test.Text += item.Summary.Text + Environment.NewLine;
  15. }
  16. }
  17. catch
  18. {
  19. test.Text += "Connection Failed\n";
  20. }
  21. }

解决方法

试一试……
  1. SyndicationFeed Feed = null;
  2.  
  3. SyndicationClient client = new SyndicationClient();
  4.  
  5. var FeedUri = new Uri(myUri);
  6.  
  7. try {
  8. var task = client.RetrieveFeedAsync(FeedUri).AsTask();
  9.  
  10. task.ContinueWith((x) => {
  11. var result = x.Result;
  12.  
  13. Parallel.ForEach(result.Items,item => {
  14. Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() =>
  15. {
  16. test.Text += item.Title.Text;
  17. });
  18. });
  19. });
  20. }
  21. catch (Exception ex) { }

我在我的机器上尝试使用Grid应用程序模板向应用程序添加按钮.我可以来回滚动项目网格,同时更新页面标题没有问题.虽然我没有很多项目,但它的速度非常快,所以很难100%肯定.

猜你在找的C#相关文章