Windows Phone C#异步获取https请求

问题描述:

我想通过https实现异步获取请求。这是分离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(); 
    } 

BeginGetResponse(我假设在UI线程上调用)是异步的。这将在与UI线程不同的线程上调用ReadWebRequestCallbackBeginGetResponse使用异步UI,因此它可能不会使用“线程”执行IO工作 - 可能会将其卸载到硬件中。但是,它使用另一个线程池线程来调用您的回调。

继续在回调中执行异步操作也是一个好主意。 ReadToEnd是同步的。只要您阻塞了用于会话的异步IO子系统的线程,它就可能会阻止其他任何异步IO,直到您解除阻止并从回调中返回。如果您使用的是.NET 4.5,请查看StreamReader.ReadtoEndAsync。如果不是,则必须使用下拉到Stream.BeginRead并循环,直到收到所有数据。

是的,它被执行异步。您可以通过调试进行确认,在ReadWebRequestCallback方法中放置一个断点并在authHttp方法中逐步调用(F10)BeginGetResponse调用。当你这样做时,你会注意到你的断点没有被击中。它会晚点击。