为什么我们需要BeginGetResponse和BeginRead?

时间:2012-02-22 00:35:11

标签: c# .net httpwebrequest

我正在查看以下使用C#进行异步Web请求的参考:

http://msdn.microsoft.com/en-us/library/86wf6409%28v=vs.100%29.aspx

当我使用BeginGetResponse和EndGetResponse构建示例代码时,我的“异步调用”仍需要数百毫秒才能完成。

有人解释为什么读取需要另一个异步调用,而BeginGetResponse应该已经在一个单独的线程上?

2 个答案:

答案 0 :(得分:5)

因为BeginGetResponse / EndGetResponse与连接到Http端点(服务器可能需要一些时间来响应)有关,而BeginRead / EndRead与从响应流中读取可能很长的响应有关。

想象一下,您的响应需要10秒才能在服务器上生成,并且它吐出的数据量是10MB。

  • 如果没有第一对Begin / EndGetResponse调用,您的线程将被阻止至少10秒,等待响应的第一个字节返回。

  • 如果没有第二组Begin / EndRead调用,当您一次读取一个网络数据包的10MB数据时,您的线程将被阻塞(请记住,TCP数据包的大小有限,因此需要一段时间才能完成所有他们回到客户端)

答案 1 :(得分:2)

我认为它映射到底层套接字操作。 BeginGetResponse建立与服务器的连接(这就是为什么需要这么长时间)并发送请求,而BeginRead则等待响应数据。

相关问题