我正在用 C# 编写一个应用程序来测量和显示下载速度。我有以下代码可以分块下载一个 62MB 的文件,这似乎对我的目的很有效。我计划扩展它以测量每个块所需的时间,因此可以绘制图表。
在这样做之前,我有几个问题要确保这实际上是在做我认为它正在做的事情。这是代码:
private void DownloadFile()
{
string uri = ConfigurationManager.AppSettings["DownloadFile"].ToString();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(uri));
int intChunkSize = 1048576; // 1 MB chunks
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
byte[] buffer = new byte[intChunkSize];
int intStatusCode = (int)response.StatusCode;
if (intStatusCode >= 200 && intStatusCode <= 299) // success
{
Stream sourceStream = response.GetResponseStream();
MemoryStream memStream = new MemoryStream();
int intBytesRead;
bool finished = false;
while (!finished)
{
intBytesRead= sourceStream.Read(buffer, 0, intChunkSize);
if (intBytesRead > 0)
{
memStream.Write(buffer, 0, intBytesRead);
// gather timing info here
}
else
{
finished = true;
}
}
}
}
}
问题:
响应是否包含实例化时的所有数据,还是仅包含标头信息?response.ContentLength 确实反映了正确的值。
即使我使用 1 MB 的块大小,每次迭代中读取的实际字节数 (intBytesRead) 也要少得多,通常为 16384 字节 (16 KB),但有时为 1024 (1 KB)。为什么是这样?
有没有办法强制它实际读取 1 MB 块?
将数据实际写入 MemoryStream 是否有任何用途?
谢谢。
担