3

このコードは、ボタンのクリックを処理するWindowsストアアプリにあります。しかし、どういうわけか、まれにこのボタンをクリックするとUIがフリーズします。これは主に、通常接続しているネットワークよりも遠くにある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<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

RetrieveFeed()バックグラウンドスレッドで呼び出してみてください。おそらく、リクエストまたはレスポンスの処理には多くの時間がかかり、UIスレッドで開始された場合はUIスレッドで実行されます。

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

一部のWindowsPhoneアプリで同じ問題が発生しましたが、適切な説明がありません。唯一の適切な問題は、Killercamが参照したものと同じです。

非同期メソッドを呼び出すと、すぐには返されません(メソッドはのようなものではないと思いますreturn Task.Factory.StartNew(...);)。何らかの作業を行い、コールバックを設定してから、実行する作業にネットワーク接続に関連するものがある場合は戻ります。遅い接続では、これは機能をブロックする可能性があります。

この症状をテストする良い方法は、wifiでルーターに接続してから、ルーターをインターネットから切断することです。これは、説明しているのと同じ動作になります。

于 2013-01-25T21:51:06.717 に答える