.net 限制HttpWebResponse流读取速度

.net 限制HttpWebResponse流读取速度,.net,multithreading,asynchronous,.net,Multithreading,Asynchronous,我使用此代码读取HttpWebResponse流 Stream stm=httpResp.GetResponseStream(); Stream fs=新文件流(文件名,FileMode.Append,FileAccess.Write); 字节[]buff=新字节[1024*16]; AsyncCallback=null; 回调=ar=> { int bytesRead=stm.EndRead(ar); fs.Write(buff,0,字节读取); 如果(字节读==0) 返回; stm.Begi

我使用此代码读取HttpWebResponse流

Stream stm=httpResp.GetResponseStream();
Stream fs=新文件流(文件名,FileMode.Append,FileAccess.Write);
字节[]buff=新字节[1024*16];
AsyncCallback=null;
回调=ar=>
{
int bytesRead=stm.EndRead(ar);
fs.Write(buff,0,字节读取);
如果(字节读==0)
返回;
stm.BeginRead(buff,0,buff.Length,回调,null);
};
stm.BeginRead(buff,0,buff.Length,回调,null);
我想限制下载速率。如果我在回调中放置一个Thread.Sleep(),它将保持线程阻塞,但是它不能很好地扩展到许多流。
有没有其他方法可以实现下载限制和线程经济性?

在循环中设置睡眠可能会限制下载速率。它取决于底层协议实现和内部网络流缓冲区的大小

在我的系统(Windows Server 2008、.NET 4.5)上,将睡眠置于循环中会限制下载速度

它还取决于属性的设置。文档说明默认设置为
true
,但我的测试表明,在我的系统上默认设置为
false
。事实上,尝试将其设置为
true
会引发异常

但是,Silverlight的默认值似乎是
true
。请查看该属性。当设置为
true
时,在准备读取响应之前,将读取并缓冲整个响应

假设限制读取请求的速率会限制下载速率(如果禁用读取流缓冲,这似乎是合理的),我认为使用
BeginRead
/
EndRead
并没有什么好办法。正如您所指出的,在其中放入
线程.Sleep
不会很好地扩展

使用.NET 4.5和C 5,在读取响应流时,应考虑使用<代码> GETRealSaveYcNC/<代码>以获得响应,以及<代码> RealSycNc<代码>。使用.NET4.0,您可以创建一个用于阅读的。这两种方法中的任何一种都可以让您使用来创建延迟。在控制下载速度方面,这将与线程睡眠具有相同的效果,但不会阻止线程


不幸的是,我没有一个例子给你。

你确定这会限制下载速率吗?我想是的,如果它在数据块之间暂停,你可能需要测试它。我想你会感到惊讶的。我测试了它,发现数据块之间有一些延迟。下载文件的总时间更长(这就是我想要的)。您是否提供了一些替代方案?我建议网络堆栈将继续接收数据并对其进行缓冲,因此在代码中添加延迟只控制程序获取数据的速度,而不是从服务器下载数据的速度。