2012-02-22 129 views
0

我期待在下面参考用于与C#异步Web请求:为什么我们需要BeginGetResponse和BeginRead?

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

当我创建示例代码,只有BeginGetResponse和EndGetResponse,我的“异步调用”仍需要几百毫秒到完成。

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

+0

那么您希望数据在收到后立即被读取,并且不断读取新数据,而不是读取缓冲区中的所有数据并获取更多的数据不是吗?但如果你的反应是短暂的爆发,那么产生一个新的线程可能确实有点贵.. – Kakira 2012-02-22 00:47:06

+0

从互联网服务器下载千兆字节文件。需要几秒钟才能开始,需要几分钟才能完成。 – 2012-02-22 01:37:26

回答

2

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

5

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

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

  • 没有第一对开始/ EndGetResponse的电话,您的线程将被屏蔽至少10秒来等待响应的第一个字节回来。

  • 如果没有第二组开始/结束读取调用,当您每次读取一个网络数据包的10MB数据时,您的线程将被阻止(请记住,TCP数据包的大小有限,所以它们需要一段时间回到客户端)