Await阻止UI线程,网络相关

我在我的Windowsapp store应用中有这段代码,我点击了按钮。 但不知何故,当我在极少数情况下单击此按钮时,UI会冻结。 当我连接到比通常连接的Wi-Fi网络更远的Wi-Fi网络时,通常会发生这种情况。 考虑到我从互联网上下载RSS源,很可能与我使用async / await关键字有关。 如果我正确理解async / await的机制,UI线程根本不应该阻塞。 我在这里错过了什么吗?

private async void Add_Click(object sender, RoutedEventArgs e) { AddButton.Visibility = Windows.UI.Xaml.Visibility.Collapsed; DownloadProgressRing.Visibility = Windows.UI.Xaml.Visibility.Visible; DownloadProgressRing.IsActive = true; RssData rssData = App.Current.Resources["rssData"] as RssData; Uri uri = FixUrl(RssUrl.Text); if (uri != null) { newRssFeed = new RssFeed(uri.ToString()); Task success = newRssFeed.RetrieveFeed(); if (await success) { SubmitButtonPanel.Visibility = Windows.UI.Xaml.Visibility.Visible; FeedTitleTextBox.Text = newRssFeed.Title == null ? String.Empty : newRssFeed.Title; } } } 

RssFeed的构造函数:

  public RssFeed(string url) { Url = url; } 

RetrieveFeedfunction:

  public async Task RetrieveFeed() { if (Url != null) { try { SyndicationClient sc = new SyndicationClient(); SyndicationFeed sf = await sc.RetrieveFeedAsync(new Uri(Url, UriKind.Absolute)); if (sf != null) { ValidateAndInitFeed(sf); return true; } } catch (Exception ex) { } } return false; } private void ValidateAndInitFeed(SyndicationFeed feed) { if (feed.Title != null) Title = feed.Title.Text; if (feed.ImageUri != null) Image = feed.ImageUri.ToString(); if (feed.Subtitle != null) Subtitle = feed.Subtitle.Text; } 

尝试在后台线程上调用RetrieveFeed() 。 也许处理请求或响应是需要花费大量时间的,如果它是在UI线程上启动的 – 它将在UI线程上运行。

 Task success = null; await Task.Run( () => success = newRssFeed.RetrieveFeed()); 

使用async / await看起来还行。 您引用了远程Wi-Fi连接,这可能完全归结为弱信号,因此带宽较差。

我希望这有帮助。

我在我的一些Windows Phone应用程序上遇到了同样的问题,我没有任何好的解释,唯一的好处就是Killercam提到的那个。

当你调用异步方法时,它不会立即返回(我假设方法不像return Task.Factory.StartNew(...); ),它做了一些工作,设置回调然后返回,如果它所做的工作有与网络连接有关的任何事情,在缓慢的连接中,这会阻止该function。

测试此症状的一个好方法是连接到具有wifi的路由器,然后断开路由器与Internet的连接,您将具有与您描述的相同的行为。