2012-08-10 2 views
3

https를 통한 비동기 get-request를 구현하고 싶습니다. 이는 UI와 요청 스레드를 분리하는 데 필요합니다. 이 코드는 잘 작동하지만 실제로 비동기인지 확실하지 않습니다. 이 코드의 성능 비평을 제공하십시오.Windows Phone C# 비동기 https 요청

public void authHttp() 
    { 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("uri"); 
     request.BeginGetResponse(new AsyncCallback(ReadWebRequestCallback), request); 
    } 

    private void ReadWebRequestCallback(IAsyncResult callbackResult) 
    { 
     HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState; 
     HttpWebResponse myResponse = (HttpWebResponse)myRequest.EndGetResponse(callbackResult); 

     using (StreamReader httpwebStreamReader = new StreamReader(myResponse.GetResponseStream())) 
     { 
      string results = httpwebStreamReader.ReadToEnd(); 
      //TextBlockResults.Text = results; //-- on another thread! 
      //Dispatcher.BeginInvoke(() => TextBlockResults.Text = results); 
     } 
     myResponse.Close(); 
    } 

답변

2

BeginGetResponse (UI 스레드에서 호출되는 것으로 가정)은 비동기입니다. 그러면 UI 스레드와 다른 스레드에서 ReadWebRequestCallback이 호출됩니다. BeginGetResponse은 비동기 UI를 사용하므로 IO 작업을 수행하는 데 "스레드"를 사용하지 않을 수 있습니다. 이는 하드웨어로 오프로드 될 수 있습니다. 그러나 다른 스레드 풀 스레드를 사용하여 콜백을 호출합니다.

콜백에서 비동기 작업을 계속 수행하는 것도 좋은 방법입니다. ReadToEnd은 동기식입니다. 세션에 사용 된 비동기 IO 하위 시스템에서 스레드를 차단 한 경우에는 차단 해제하고 콜백에서 복귀 할 때까지 다른 비동기 IO를 차단하는 것이 좋습니다. .NET 4.5를 사용하는 경우 StreamReader.ReadtoEndAsync을 확인하십시오. 그렇지 않은 경우에는 Stream.BeginRead까지 드롭 다운해야하고 모든 데이터가 수신 될 때까지 반복해야합니다.

2

예, 비동기로 실행됩니다. 디버깅하고 ReadWebRequestCallback 메서드에 중단 점을 넣고 authHttp 메서드에서 BeginGetResponse 호출을 단계적으로 수행 (F10)하여 확인할 수 있습니다. 이렇게하면 중단 점에 도달하지 않은 것을 알 수 있습니다. 그것은 나중에 치게 될 것이다.