2

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

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

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

4

1 回答 1

5

Begin* 和 End* 模式总是相同的:

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

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

于 2009-12-27T22:45:33.543 回答