3

我在我处理按钮单击的 Windows 应用商店应用程序中有这段代码。但不知何故,当我在极少数情况下单击此按钮时,UI 会冻结。当我连接到比我通常连接的网络更远的 Wi-Fi 网络时,通常会发生这种情况。考虑到我是从 Internet 下载 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<bool> 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; 
    }

RetrieveFeed 函数:

    public async Task<bool> 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;
    }
4

3 回答 3

2

Try calling RetrieveFeed() on a background thread. Perhaps processing the request or response is what takes a lot of time and if it is started on UI thread - it will run on UI thread.

Task<bool> success = null;
await Task.Run(
    () => success = newRssFeed.RetrieveFeed());
于 2013-01-25T17:26:17.380 回答
0

使用async/await看看还行。您引用了远程 Wi-Fi 连接,这可能纯粹是由于信号较弱,因此带宽较差。

我希望这有帮助。

于 2013-01-25T17:07:46.397 回答
0

我的一些 Windows Phone 应用程序也有同样的问题,我没有任何好的解释,唯一好的解释是 Killercam 提到的。

当您调用异步方法时,它不会立即返回(我假设这些方法不是类似的return Task.Factory.StartNew(...);),它会做一些工作,设置回调然后返回,如果它所做的工作与网络连接有关,在慢速连接中,这可能会阻止该功能。

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

于 2013-01-25T21:51:06.717 回答