3

Windows 8 アプリの非同期関数を使用して、Web サイトをダウンロードして解析しようとしています。

このメソッドでダウンロード コードを呼び出します。

private async Task<Show> getSeasonAndEpisodeInformation(Show currentShow)
    {
        int seriesID = currentShow.SeriesID;
        EpisodeBuilder epBuilder = new EpisodeBuilder(seriesID);

        List<Episode> eps = await epBuilder.getEpisodeList();
        SeasonBuilder seasonBuilder = new SeasonBuilder(eps);

        return currentShow;
    }

getEpisodeList() 関数は次のとおりです。

public async Task<List<Episode>> getEpisodeList()
    {
        httpClient = new HttpClient();
        httpClient.MaxResponseContentBufferSize = 2560000;
        httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");

        try
        {
            List<Episode> episodes = new List<Episode>();
            HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://www.example.com"));
            response.EnsureSuccessStatusCode();
            //Never get here

            return episodesList;
        }
        catch (Exception)
        {

        }

        return null;
    }

getEpisodeList メソッドを無効にすると、Web ページがダウンロードされて続行されます。デバッグして、完了していないのは httpClient.GetAsync(..) 行であることを確認しました。とにかくこのあたりはありますか?

getSeasonAndEpisodeInformation メソッドでは、続行する前に getEpisodeList() メソッドが返されたことを確認する必要があります。そのため、epBuilder.getEpisodeList() を呼び出すときに await キーワードを使用します。

4

2 に答える 2

0

投稿したコードはすべて問題ないようです。あなたはおそらく呼び出し中Task.WaitTask.Result、呼び出しツリーのさらに上のどこかです。ブログで説明しているように、これによりデッドロックが発生します。

これを修正するには、Waitまたはへのすべての呼び出しを削除しますResult。「awaitずっと下」を使います。

于 2012-11-04T22:09:02.137 に答える
0

http.GetAsync を呼び出すときに「await」キーワードを削除して、これを修正しました。呼び出しが終了し、getSeasonAndEpisodeInformation メソッドの「await」により、呼び出しが非同期で実行されることが保証されます。

于 2012-11-04T22:43:47.830 に答える