【问题标题】:Understanding Asynchronous HttpWebRequest了解异步 HttpWebRequest
【发布时间】:2009-12-27 22:24:19
【问题描述】:

我正试图弄清楚这到底是如何工作的。

HttpWebRequest 有一个方法BeginGetResponse,它接受ResponseCallback 作为参数。首先,这个回调是立即(在一个新线程中)还是一旦它收到来自服务器的响应?还是EndGetResponse的工作就是等待回复?

其次,收到响应后,您可以立即访问响应流,但在完成下载之前,流不包含完整页面,因此 BeginRead。但是,我似乎可以通过HttpWebResponse.ContentLength 之类的属性立即访问所有标题。这是否意味着 EndGetResponse 在完全下载标头之前不会完成,还是当您调用 ContentLength 参数时它会挂起一段时间,直到收到该标头?

【问题讨论】:

    标签: c# asynchronous httpwebrequest httpwebresponse


    【解决方案1】:

    Begin* 和 End* 模式始终相同:

    • 传入 AsyncCallback 以开始
    • 等待该回调的调用(不是立即)
    • 在回调中调用 End* 总是
    • 检查回调/IAsyncResult 是否成功(是 取消?任何异常/错误?)
    • 在此处使用 End* 的结果..

    在您的情况下,结果是一个 WebResponse 实例,其中包含标头。所以我认为可以安全地假设响应的那部分已经收到:WebResponse 对象没有隐藏在其属性中的异步魔法。如果您访问 ContentLength 它只是一个常规属性,并且对象不知道也不关心您是使用阻塞调用还是异步调用获得它。

    【讨论】:

    • 所以你认为 ResponseCallback 在标头下载之前不会被调用?很公平。你知道如何检查它是否被取消,或者是检查EndGetResponse抛出的异常的唯一方法吗?
    • 除非您实现了取消此操作的方法,否则我不知道如何停止此特定方法 - 它作为 ThreadPool 上的操作运行,您和用户现在都无法停止它。不过,一般模式通过扩展合同允许更好的取消机制。例如,WebClient 可以做到这一点,并允许您订阅获取 AsyncCompletedEventArgs 实例的事件,该实例再次提供 .Cancelled 属性。这是基于上面给出的模式的纯粹便利的东西。
    • 它实际上可以很容易地停止:ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, TimeoutCallback, conn, TimeOutInterval, true); 我想我可以添加我自己的Cancelled 属性,而我正在使用它。 WebClient 并没有达到我想要的效果,所以我正在重建它,使其更加灵活,并支持多个并发下载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多