【问题标题】:Windows Phone C# Asynchronous get https requestWindows Phone C# 异步获取 https 请求
【发布时间】:2012-08-10 18:47:33
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多