HttpWebRequest和HttpWebResponse是理想的异步缓冲区大小

时间:2011-10-05 19:00:59

标签: c# asynchronous httpwebrequest httpwebresponse

我正在尝试在.NET 3.5中使用HttpWebRequest和HttpWebResponse,异步运行它们:BeginGetRequestStream,EndGetRequestStream,BeginWrite,EndWrite,BeginGetResponse,EndGetResponse,BeginRead,EndRead - 处理请求的所有部分都是异步的。

我有几个线程发送大量并发请求。 EndRead和EndWrite都是阻塞操作 - 它们阻塞当前线程,同时完成对流的实际读/写操作,我正在尝试为这些操作提供理想的输入/输出缓冲区大小。

我的理由是这样的:因为我一次有多个请求处于活动状态,它们会继续触发回调,让线程知道有一些数据可用或数据已发送。如果我的缓冲区很大,通过线路读取/写入数据将花费更长时间,因此EndRead / EndWrite将阻塞更长时间。这会强制同一线程上的其他请求等待一段时间,因为它们的通知必须等到线程被解除阻塞。

所以,我的问题是,在这种情况下,什么是良好的读/写缓冲区大小。我在考虑每个2048字节,但我在各种博客中看到的一些示例代码显示了截然不同的值。

提前感谢任何想法。

2 个答案:

答案 0 :(得分:1)

除了避免明显的极端情况之外,对于您应该设置的实际值没有确定的规则。这实际上取决于您要传输的数据类型,以及有多少数据。您可能希望将写入缓冲区设置得相当高,但要将读取缓冲区保持在较低水平。这是因为当涉及到这种事情时,写入(通常)比读取更昂贵。

在这种情况下,最好的办法是尝试一些值,看看它们的扩展程度。如有必要,您可以随时更改它们。

答案 1 :(得分:1)

我认为更好的解决方案是不要过多担心缓冲区大小,但不要阻塞线程。如果将委托传递给callback方法的Begin*参数,则在操作完成时执行该回调,您可以从那里调用End*,这将(几乎)立即返回。没有必要阻止。

关于缓冲区大小,如果它们对您真正重要,您应该剖析并找出在您的特定情况下最有效的方法。