在使用请求网络内容的时候,一般如下面这种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 非生产环境代码,请在实际使用时进行必要调整 // —— Mitchell Chu // Blog:blog.useasp.net HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); using (var response = (HttpWebResponse)request.GetResponse()) using (var stream = response.GetResponseStream()) { byte [] buffer = new byte [4096]; int read = 0; while ((read = stream.Read(buffer, 0, buffer.Length)) >0){ // buffer... } } |
使用这种方式,一旦我们开始下载数据,即是全速下载——即理论上是客户端和服务端的最小速度为当前速度。如果以这个速度持续下载,要不服务端被拖垮,要不就是客户端被服务端封禁。当然,一般情况下,后者居多。在持续的针对某站资源下载的时候,限速是非常必要的。
在HttpWebResponse里面比较简单,只需要控制读取的速度,即可达到限速的目的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // 非生产环境代码,请在实际使用时进行必要调整 // —— Mitchell Chu // Blog:blog.useasp.net HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); using (var response = (HttpWebResponse)request.GetResponse()) using (var stream = response.GetResponseStream()) { byte [] buffer = new byte [4096]; int read = 0; long total_read = 0; DateTime begin = DateTime.Now; TimeSpan ts = new TimeSpan(); while ((read = stream.Read(buffer, 0, buffer.Length)) >0){ total_read += read; ts = DateTime.Now - begin; if ((total_read / ts.TotalSeconds) > 1024){ Thread.Sleep(1); // 休息一下. } } } |
原文