为什么我们需要BeginGetResponse和BeginRead

本文关键字:BeginRead BeginGetResponse 我们 为什么 | 更新日期: 2023-09-27 18:25:34

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

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

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

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

为什么我们需要BeginGetResponse和BeginRead

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

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

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

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

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