WebReponse.GetStream的奇怪行为

Iha*_*nik 1 .net c# download stream httpwebresponse

我正在写web下载器并遇到了这个奇怪的问题.示例代码:

 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;
                }
            }
      }
  }
Run Code Online (Sandbox Code Playgroud)

问题:当'chunk'变量== 1或2个字节时,它没问题.但是当这个尺寸更大时 - 图像会受到干扰!我已经发现它具有下载速度(响应读取速度),因为当我设置较大的尺寸chunk并插入Thread.Sleep(time)最后一行while循环时,图像保持正常.希望有人可以帮助我.

1个字节的块大小 50千字节块大小

Jon*_*eet 5

这一点都不奇怪 - 你只是误用了溪流.您假设单个调用Read将读取您要求的整个缓冲区.情况并非如此 - 它可以轻松减少回报.你应该改变这个:

responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, buffer.Length);
byteReaded += bytesCountToRead;
Run Code Online (Sandbox Code Playgroud)

至:

int chunkRead = responseStream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, chunkRead);
byteReaded += chunkRead;
Run Code Online (Sandbox Code Playgroud)

永远不应该忽略它的返回值Stream.Read.

此外,无需在每次迭代时创建新的字节数组.

最后,如果你使用.NET 4,所有这一切都可以写很多简单的多:

using (var responseStream = response.GetResponseStream())
{
    using (Stream file = File.Create(filePath))
    {
        responseStream.CopyTo(file);
    }
}
Run Code Online (Sandbox Code Playgroud)

(或者只是使用WebClient/ HttpClient开头......)