为什么我们需要BeginGetResponse和BeginRead?

mer*_*011 0 .net c# httpwebrequest

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

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

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

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

Dmi*_*kel 5

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

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

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

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