C# WebResponse.GetStream的奇怪行为
我正在写web downloader,遇到了一个奇怪的问题。 示例代码:C# WebResponse.GetStream的奇怪行为,c#,.net,stream,download,httpwebresponse,C#,.net,Stream,Download,Httpwebresponse,我正在写web downloader,遇到了一个奇怪的问题。 示例代码: int chunk; var request = WebRequest.Create(uri) as HttpWebRequest; using (WebResponse response = request.GetResponse()) { using (var responseStream = response.GetResponseStream()) { u
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;
}
}
}
}
int块;
var request=WebRequest.Create(uri)为HttpWebRequest;
使用(WebResponse=request.GetResponse())
{
使用(var responseStream=response.GetResponseStream())
{
使用(Stream file=file.Create(filePath))
{
长byteReaded=0;
long contentLength=response.contentLength;
while(byteReadedchunk?chunk:contentLength-byteReaded;
字节[]缓冲区=新字节[ByteCountToRead];
responseStream.Read(缓冲区,0,缓冲区长度);
file.Write(buffer,0,buffer.Length);
byteReaded+=byteCountToRead;
}
}
}
}
问题:
当'chunk'变量==1或2字节时,就可以了。但是当这个尺寸变大时,图像会被扰乱!我发现这与下载速度(响应读取速度)有关,因为当我设置较大的块大小并在循环的最后一行插入Thread.Sleep(time)
时,图像保持正常。
希望有人能帮助我
这一点也不奇怪——你只是误用了流。您假设对Read
的单个调用将读取您请求的整个缓冲区。事实并非如此——它可以很容易地减少回报。您应该更改此选项:
responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, buffer.Length);
byteReaded += bytesCountToRead;
致:
永远不要忽略流的返回值。读取
此外,无需在每次迭代中创建新的字节数组
最后,如果您使用的是.NET 4,所有这些都可以编写得更简单:
using (var responseStream = response.GetResponseStream())
{
using (Stream file = File.Create(filePath))
{
responseStream.CopyTo(file);
}
}
(或者从使用WebClient
/HttpClient
开始…这一点都不奇怪-您只是误用了流。您假设对Read
的单个调用将读取您请求的整个缓冲区。事实并非如此——它可以很容易地减少回报。您应该更改此选项:
responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, buffer.Length);
byteReaded += bytesCountToRead;
致:
永远不要忽略流的返回值。读取
此外,无需在每次迭代中创建新的字节数组
最后,如果您使用的是.NET 4,所有这些都可以编写得更简单:
using (var responseStream = response.GetResponseStream())
{
using (Stream file = File.Create(filePath))
{
responseStream.CopyTo(file);
}
}
(或者只需使用WebClient
/HttpClient
开始…也许这并不重要,但在您周围放置一些参数long bytescontoread=…
)。我敢肯定,这不是你想要的!也许这并不重要,但是在你周围放一些参数,long bytescontoread=…
。我敢肯定,这不是你想要的!你是我的救世主!谢谢我已经开始使用WebClient,但是要停止它和暂停保存进度更难。你是我的救世主!谢谢我已经开始使用WebClient,但是要停止它和暂停保存进度要困难得多。