3

다시 PCL (Portable Class Library)의 WebRequest에 문제가 있습니다.WP8의 HttpWebRequest.BeginGetResponse

나는이 코드 조각이 : 이제

static ManualResetEvent allDone = new ManualResetEvent(false); 
    static string doc; 

    static public void AddAnime(string encodedLogin, string id, int episodes, int status, int score) 
    { 
     if (string.IsNullOrEmpty(encodedLogin)) 
     { 
      throw new ArgumentException(); 
     } 
     else 
     { 
      doc = String.Format("anime_id={0}&status={1}&episodes={2}&score={3}", id, "watching", episodes, score); 

      HttpWebRequest request = HttpWebRequest.CreateHttp("http://mal-api.com/animelist/anime"); 

      request.Method = "POST"; 
      request.Headers["Authorization"] = encodedLogin; 

      request.BeginGetRequestStream(new AsyncCallback(GetRequestCallBack), request); 

      allDone.WaitOne(); 

      s.ToString(); 
     } 
    } 

    static private void GetRequestCallBack(IAsyncResult aResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)aResult.AsyncState; 

     Stream postStream = request.EndGetRequestStream(aResult); 

     byte[] byteArray = Encoding.UTF8.GetBytes(doc); 

     postStream.Write(byteArray, 0, doc.Length); 
     postStream.Flush(); 

     request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request); 
    } 

    static private void GetResponseCallback(IAsyncResult asyncResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; 

     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult); 

     Stream dataStream = response.GetResponseStream(); 
     StreamReader streamReader = new StreamReader(dataStream); 

     string responseString = streamReader.ReadToEnd(); 

     //Do something with string here 

     allDone.Set(); 
    } 

, 문제는 내가 샘플 콘솔 응용 프로그램에 AddAnime를 호출 할 때, 이것이 내가 내 WP8 장치 또는 에뮬레이터에서 호출 할 때 완벽하게 정상적으로 실행하지만,이다 (WXGA), BeginGetResponse에 붙어 있습니다. GetResponseCallback을 전혀 입력하지 않고 (중단 점을 테스트 한) BeginGetResponse 코드 바로 다음에 코드를 계속 입력하지 않습니다. 나는 2 분 이상 기다렸다. TimeOutException (나는 생각한다)을 던져야한다. 그러나 그때에도 아무 일도 일어나지 않았다.

  • 콘솔 응용 프로그램 (작품)
  • WP8 WXGA 에뮬레이터 (작동하지 않습니다)
  • WP8 장치
  • WP8 장치가 분리 (작동하지 않는) 연결 (:

    나는 테스트 내 PCL 들어

일) 나는 대상으로하지 않습니다

,
  • SL4 높은
  • WP7 높은
  • 윈도우 스토어는
  • 는 .NET 4.5

나는이 문제를 어떻게 해결할 수 있을까? 상호 호환성을 보장하기 위해 PCL이 사용되지 않았습니까?

+1

SideNote : 'request.GetResponseAsync()'와 같은 TPL (async/await)을 사용하지 않는 이유는 무엇입니까? 코드가 더 간단하고 유지하기 쉽습니다. –

+0

TPL 익숙해지기까지 조금 시간이 걸리지 만 –

+0

을 좋아하지만 SL4, WP7.1, WP8 및 Windows Store를 대상으로하는 휴대용 클래스 라이브러리에서 어떻게 사용합니까? –

답변

2

Windows Phone (및 Silverlight, 필자는 생각합니다.)은 UI 스레드에서 네트워크 작업 결과를 기다리지 못하게합니다. 당신은 호출자에게 스레드의 제어권을 되돌려 줄 필요가있다. 만약 당신이 블록하려고한다면 교착 상태가 될 것이다.

가장 쉬운 방법은 Tasks 및 async/await입니다. Async Targeting Pack을 출시했습니다.이 플랫폼은 타겟팅하는 플랫폼 (및 타겟팅하는 휴대용 클래스 라이브러리)에이 지원을 추가합니다. Windows Phone 7.0은 지원되지 않으므로 Windows Phone 7.1/7.5를 선택해야합니다 (다른 곳에서는 다른 버전 번호를 사용하는 것과 동일하지만 마찬가지입니다).