2012-11-04 4 views
3

Windows 8 앱의 비동기 함수를 사용하여 웹 사이트를 다운로드하고 구문 분석하려고합니다.HttpClient GetAsync가 Windows 8에서 void가 아닌 반환 유형으로 완료되지 않습니다.

나는이 방법에서 다운로드 코드를 호출 :

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 방법은 무효가있는 경우 다음 웹 페이지를 다운로드하고 계속 . 디버깅을 완료하고 결코 완료되지 않은 httpClient.GetAsync (..) 행인지 확인했습니다. 이 주변에 어쨌든 있습니까?

getSeasonAndEpisodeInformation 메소드에서 계속하기 전에 getEpisodeList() 메소드가 리턴되었는지 확인해야합니다. 따라서 epBuilder.getEpisodeList()를 호출 할 때 await 키워드를 사용하십시오.

+0

예외를 삼키지 마십시오. – SLaks

+0

나는 내 코드에서 좀 더 나은 예외 처리를하고있다. – TheSteak

답변

0

http.GetAsync를 호출 할 때 "await"키워드를 제거하여이 문제를 해결했습니다. 이제 호출이 완료되고 getSeasonAndEpisodeInformation 메소드의 'await'이 비동기 적으로 실행되는지 확인합니다.

+0

필자는 본질적으로 getEpisodeList() 메소드를 차단했다고 생각합니다. –

0

게시 한 코드는 모두 괜찮습니다. 호출 트리보다 더 멀리 어딘가에 Task.Wait 또는 Task.Result을 호출했을 것입니다. 내 블로그에 설명하는대로 this will cause a deadlock.

이 문제를 해결하려면 Wait 또는 Result으로 전화를 모두 제거하십시오. "await"을 사용하십시오.

관련 문제