关于C#:异步httpwebrequest的部分

parts of an asynchronous httpwebrequest

有许多与httpwebrequest相关的内容可以异步进行。我记得在这里读到一个有关这个主题的问题,但似乎再也找不到了。所以我会再问这个问题。可以说,以下哪一项能带来最大的收益。

BeginGetRequestStream / EndGetRequestStream

BeginWrite / EndWrite

BeginGetResponse / EndGetResponse

BeginRead / EndRead

我知道BeginGetResponse必须与BeginGetRequestStream配对。因此,无需重申这一事实。

根据我所做的调查,似乎BeginRead / EndRead最具潜力。这有点令人震惊。看起来EndGetResponse的返回速度相当快,并且在"首次联系"之后以及任何实际数据读取之后会有明显的延迟。我很确定我会立即得到一些标题,然后是一个很长的延迟,然后是我想要的数据。

我想我的真正问题是:BeginGetResponse是否做错了什么?还是BeginRead真正有价值的参与者?

一如既往,在此先感谢。


EndGetResposnse(或者实际上是同步GetResponse)在接收到数据开始时返回。这可以占总响应时间的一小部分或很大一部分。

有了很大的响应,大部分时间不会花在等待任何这些上面,而是花在读取和处理流本身上。值得注意的是,这可以(尤其是如果Web服务器正在发送分块数据)在数据传入时进行解析。

因此,最大的性能获胜在于可以有效地将其传递到下一个水平的方式进行处理。一种方法是使整个处理过程变得异步,而不是使用httpwebrequest的异步方法。

另一个是,如果您要从响应中生成一个集合类型,请使用基于yield的即可枚举的数量,该数量允许按需处理(非常强大,与可用的延迟执行结合在一起)通过将其传递给进一步的基于yield的处理,或使用LINQ方法)。这样做的好处可能超过采用麻痹方法所获得的好处,尽管它们也可以组合在一起。