Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpWebRequest和HttpWebResponse理想异步缓冲区大小_C#_Asynchronous_Httpwebrequest_Httpwebresponse - Fatal编程技术网

C# HttpWebRequest和HttpWebResponse理想异步缓冲区大小

C# HttpWebRequest和HttpWebResponse理想异步缓冲区大小,c#,asynchronous,httpwebrequest,httpwebresponse,C#,Asynchronous,Httpwebrequest,Httpwebresponse,我试图在.NET 3.5中使用HttpWebRequest和HttpWebResponse,异步运行它们:BeginGetRequestStream、EndGetRequestStream、BeginWrite、EndWrite、BeginGetResponse、EndGetResponse、EndGetResponse、BeginRead-处理请求的所有部分都是异步的 我有几个线程发送大量并发请求。EndRead和EndWrite都是阻塞操作——它们阻塞当前线程,而对流的实际读/写操作已经完成

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

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

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

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


提前感谢您的建议。

除了避免明显的极端情况外,对于您应该设置的实际值没有明确的规则。这实际上取决于您传输的数据类型以及数据量。您可能希望将写入缓冲区设置得很高,但将读取缓冲区设置得更低。这是因为在这类事情上,写(通常)比读更昂贵


在这种情况下,最好尝试一些值,看看它们的伸缩性如何。如果需要,您可以随时在以后更改它们。

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


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

[如果您将委托传递给Begin*方法的回调参数,则该回调将在操作完成时执行,您可以从那里调用End*,这将(几乎)立即返回,无需阻塞]。有趣的是,谁来做真正的“开始*”工作。它是来自ThreadPool的一个线程,它执行调用并等待您。与创建自己的线程执行相同的任务有什么不同?这取决于。但在IO操作的情况下。这意味着
Begin
方法开始工作并设置端口。当工作完成时,端口激发,回调在线程池线程上执行。这与创建新线程不同,因为创建新线程总是分配一百万字节。所以你说,在代理fxn中BeginA wait,在另一个代理中fxn start BeginB wait等等(而不是在线程中调用a();B()),你真的知道他的代码需要这样的复杂性吗。正如我在回答“过早优化是万恶之源”时所说的那样,我没有提到任何等待。正如OP所说,如果存在“大量并发请求”,这不是过早的优化。我知道。等待由使用BeginA*函数创建(或已经在工作)的线程完成,当结果准备就绪时,将调用您的委托。这只是为了简化工作流程。我不知道你会发现这和这个问题有多大关系,但是,我喜欢这个博客()