我目前正在处理文件下载程序项目。该应用程序旨在支持可恢复的下载。每次调用ReadBytes时,所有下载的数据及其元数据(下载范围)都会立即存储在磁盘上。我们假设我使用了以下代码段: -
var reader = new BinaryReader(response.GetResponseStream());
var buffr = reader.ReadBytes(_speedBuffer);
DownloadSpeed += buffr.Length;//used for reporting speed and zeroed every second
这里_speedBuffer是要下载的字节数,它被设置为默认值。
我已经通过两种方法测试了应用程序。首先是下载托管在本地IIS服务器上的文件。速度很快。其次,我试图从互联网上下载相同文件的副本(从实际下载的地方)。我的净速度真的很慢。现在,我观察到如果我增加_speedBuffer然后从本地服务器下载速度是好的,但对于互联网副本,速度报告很慢。然而,如果我减小_speedBuffer的值,则文件的互联网副本的下载速度(报告)是好的,但不适用于本地服务器。所以我想,为什么我不应该在运行时更改_speedBuffer。但是我提出的所有自定义算法(用于更改值)都是无效的。意味着与其他下载程序相比,下载速度仍然很慢。
这种方法可以吗?
我做错了吗?
我应该坚持_speedBuffer(字节数)的默认值吗?
答案 0 :(得分:0)
在这种情况下ReadBytes
的问题是它尝试读取完全该字节数,或者在没有更多数据要读取时返回。
因此,您收到一个包含99个字节数据的数据包,然后调用ReadBytes(100)
将等待下一个数据包包含该丢失的字节。
我根本不会使用BinaryReader
:
byte[] buffer = new byte[bufferSize];
using (Stream responseStream = response.GetResponseStream())
{
int bytes;
while ((bytes = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
DownloadSpeed += bytes;//used for reporting speed and zeroed every second
// on each iteration, "bytes" bytes of the buffer have been filled, store these to disk
}
// bytes was 0: end of stream
}