我正在编写网络下载程序并遇到了这个奇怪的问题。 示例代码:
int chunk;
var request = WebRequest.Create(uri) as HttpWebRequest;
using (WebResponse response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (Stream file = File.Create(filePath))
{
long byteReaded = 0;
long contentLength = response.ContentLength;
while (byteReaded < contentLength)
{
long bytesCountToRead = contentLength - byteReaded > chunk ? chunk : contentLength - byteReaded;
byte[] buffer = new byte[bytesCountToRead];
responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, buffer.Length);
byteReaded += bytesCountToRead;
}
}
}
}
问题:
当'chunk'变量== 1或2个字节时,没关系。但是当这个尺寸更大时 - 图像会受到干扰!我已经发现它具有下载速度(响应读取速度),因为当我设置更大的chunk
并在Thread.Sleep(time)
周期的最后一行插入while
时,图像保持正常。
希望有人能帮助我。
答案 0 :(得分:5)
这一点都不奇怪 - 你只是误用了溪流。您假设对Read
的单个调用将读取您要求的整个缓冲区。情况并非如此 - 它可以轻松减少回报。你应该改变这个:
responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, buffer.Length);
byteReaded += bytesCountToRead;
为:
int chunkRead = responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, chunkRead);
byteReaded += chunkRead;
您永远不会忽略Stream.Read
的返回值。
此外,无需在每次迭代时创建 new 字节数组。
最后,如果您使用的是.NET 4,那么所有这些都可以更简单地编写 :
using (var responseStream = response.GetResponseStream())
{
using (Stream file = File.Create(filePath))
{
responseStream.CopyTo(file);
}
}
(或者只是使用WebClient
/ HttpClient
开头...)