Windows Phone C#异步获取https请求

时间:2012-08-10 18:47:34

标签: c# multithreading windows-phone-7 https

我想通过https实现异步get-request。这是分离UI和请求线程所必需的。这段代码可以找到,但我不确定它是否真正异步。请提供此代码的性能评论。

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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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