如何有效地设置为 HttpWebRequest 下载的字节数?
How to efficiently set the number of bytes to download for HttpWebRequest?
我目前正在研究一个文件下载器项目。该应用程序旨在支持可恢复下载。每次调用 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,那么从本地服务器的下载速度很好,但对于 Internet 副本,速度报告很慢。而如果我降低 _speedBuffer 的值,则文件的 Internet 副本的下载速度(报告)很好,但对于本地服务器则不然。所以我想,为什么我不应该在运行时更改 _speedBuffer。但是我想出的所有自定义算法(用于更改值)都是低效的。意味着与其他下载器相比,下载速度仍然很慢。
这个方法可以吗?
我是不是做错了?
我应该坚持使用 _speedBuffer(字节数)的默认值吗?
在这种情况下 ReadBytes
的问题在于它试图读取 正好 那个字节数,或者 returns 当没有更多字节时要读取的数据。
因此您收到一个包含 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
}
我目前正在研究一个文件下载器项目。该应用程序旨在支持可恢复下载。每次调用 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,那么从本地服务器的下载速度很好,但对于 Internet 副本,速度报告很慢。而如果我降低 _speedBuffer 的值,则文件的 Internet 副本的下载速度(报告)很好,但对于本地服务器则不然。所以我想,为什么我不应该在运行时更改 _speedBuffer。但是我想出的所有自定义算法(用于更改值)都是低效的。意味着与其他下载器相比,下载速度仍然很慢。
这个方法可以吗?
我是不是做错了?
我应该坚持使用 _speedBuffer(字节数)的默认值吗?
在这种情况下 ReadBytes
的问题在于它试图读取 正好 那个字节数,或者 returns 当没有更多字节时要读取的数据。
因此您收到一个包含 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
}