有很多与可以异步的 httpwebrequest 相关的部分。我记得在这里读过一个关于这个话题的问题,但我似乎再也找不到了。所以我会重新问这个问题。以下哪项最划算(可以这么说)。
开始获取请求流/结束获取请求流
开始写入/结束写入
开始获取响应/结束获取响应
开始阅读/结束阅读
我知道 BeginGetResponse 必须与 BeginGetRequestStream 配对。因此无需重申这一事实。
根据我所做的调查,似乎 BeginRead/EndRead 可能最有潜力。这有点令人震惊。似乎 EndGetResponse 返回得相当快,并且在“第一次接触”和任何实际数据读取之后有明显的延迟。我很确定我会立即获得一些 header ,然后是长时间的延迟,然后是我想要的数据。
我想我真正的问题是:我是在使用 BeginGetResponse 做错了什么,还是 BeginRead 才是真正有值(value)的参与者?
一如既往,提前致谢。
最佳答案
EndGetResposnse(或者实际上,同步 GetResponse)在接收到数据开始时返回。这可能占总响应时间的一小部分或大部分。
对于大量响应,大部分时间不会花在等待任何这些上,而是花在读取和处理流本身上。值得注意的是,这可以(特别是如果网络服务器正在发送分块数据)在数据进入时被解析。
因此,最大的性能胜利可能在于以允许有效传递到下一个级别的方式处理此问题。一种方法是使整个处理异步,而不是使用 httpwebrequest 的异步方法。
另一个是,如果您从响应中生成集合类型,则可以使用基于 yield
的 ienumerable,它允许在到达时进行处理(与通过将其传递给进一步基于 yield
的处理或使用 LINQ 方法,可以延迟执行)。这样做的好处可能超过采用异步方法所获得的好处,尽管它们也可以结合使用。
关于c# - 异步 httpwebrequest 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551130/