C# WebResponse.GetStream的奇怪行为

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

我正在写web downloader,遇到了一个奇怪的问题。 示例代码:

 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,但是要停止它和暂停保存进度要困难得多。