有许多与httpwebrequest相关的部分可以异步。我记得在这里读到一个关于这个话题的问题,但我似乎无法再找到它了。所以我会重新问这个问题。以下哪一项可以获得最大收益(可以这么说)。
BeginGetRequestStream / EndGetRequestStream
BeginWrite / EndWrite
BeginGetResponse / EndGetResponse
的BeginRead / EndRead
我知道BeginGetResponse必须与BeginGetRequestStream配对。所以没必要重申这个事实。
从调查结果来看,似乎BeginRead / EndRead可能具有最大的潜力。这有点令人震惊。似乎EndGetResponse返回相当快,并且在“第一次接触”和任何真实数据即将读取之后存在显着延迟。我很确定我会立即获得一些标题,然后是一个很长的延迟,然后是我想要的数据。
我想我真正的问题是:我在使用BeginGetResponse做错了什么,或者在这里是真正有价值的玩家BeginRead?
一如既往,提前谢谢。
答案 0 :(得分:2)
EndGetResposnse(或实际上,同步GetResponse)在收到数据开头时返回。这可能是总响应时间的一小部分或大部分。
响应量很大,大部分时间都不会花在等待其中任何一个上,而是在读取和处理流本身时。值得注意的是,这可以(特别是如果网络服务器正在发送分块数据)在数据进入时进行解析。
因此,最大的表现胜利可能是以一种允许效率传递到下一级别的方式处理它。一种方法是使整个处理异步,而不是使用httpwebrequest的异步方法。
另一个是如果你从响应中产生一个集合类型,那么就可以使用一个基于yield
的ienumerable来实现它到达的处理(非常强大,与那种延迟执行一样)可以通过将其传递给基于yield
的进一步处理,或使用LINQ方法来获得。这样做的好处可能超过采用asych方法所获得的好处,尽管它们也可以合并。