C# 关于在HttpWebRequest GetResponseStream中选择缓冲区大小 var h=(HttpWebRequest)WebRequest.Create(url); 使用(var hr=(HttpWebResponse)(wait h.GetResponseAsync()) { 使用(var s=hr.GetResponseStream()) { 使用(var f=newfilestream(saveTo,FileMode.Create,FileAccess.Write,FileShare.None)) { int字节数=0; 字节[]buf=新字节[2048];//0) { 等待f.WriteAsync(buf,0,bytesSize); //更新用户界面:下载大小,百分比,。。。 } } } }
当下载进度发生变化时,我正在编写一个下载程序支持更新UI(可观察到未发送项目的收集-批量下载),并继续下载,但不支持多段下载(因为每个项目的大小通常小于10MB)。C# 关于在HttpWebRequest GetResponseStream中选择缓冲区大小 var h=(HttpWebRequest)WebRequest.Create(url); 使用(var hr=(HttpWebResponse)(wait h.GetResponseAsync()) { 使用(var s=hr.GetResponseStream()) { 使用(var f=newfilestream(saveTo,FileMode.Create,FileAccess.Write,FileShare.None)) { int字节数=0; 字节[]buf=新字节[2048];//0) { 等待f.WriteAsync(buf,0,bytesSize); //更新用户界面:下载大小,百分比,。。。 } } } },c#,httpwebrequest,size,buffer,C#,Httpwebrequest,Size,Buffer,当下载进度发生变化时,我正在编写一个下载程序支持更新UI(可观察到未发送项目的收集-批量下载),并继续下载,但不支持多段下载(因为每个项目的大小通常小于10MB)。 我运行大约5-20次并发下载。什么样的缓冲区大小适合这种情况(适用于UI更新和下载)?您希望使用的缓冲区大小是操作系统页面大小的倍数,因为这是写入磁盘和内存页面的粒度。使用小于操作系统页面大小的任何东西都是次优的 操作系统页面通常为4096字节。文件流的默认缓冲区大小也是4096字节,如果在构建过程中未提供缓冲区大小,则使用该大小
我运行大约5-20次并发下载。什么样的缓冲区大小适合这种情况(适用于UI更新和下载)?您希望使用的缓冲区大小是操作系统页面大小的倍数,因为这是写入磁盘和内存页面的粒度。使用小于操作系统页面大小的任何东西都是次优的 操作系统页面通常为4096字节。
文件流
的默认缓冲区大小也是4096字节,如果在构建过程中未提供缓冲区大小,则使用该大小
对于磁盘I/O,通常最好有一个稍大(32-128 KB)的缓冲区
在您的场景中,使用最多20次并发下载,如果要使用32或64 KB的缓冲区大小,这只需要640 KB或1.2 MB的内存,因此这些显然是可行的选择
假设您在美国,宽带和移动设备的平均下载速度分别为23 Mbps和12 Mbps,那么如果您使用64 KB缓冲区(20次并发下载为1.2 MB),您可以每秒更新20次下载中每一次的UI几次
因此,使用至少32-64KB的缓冲区
需要注意的一点是,不要连续分配新的字节缓冲区,而是通过使用缓冲池来回收这些固定大小的缓冲区
var h = (HttpWebRequest)WebRequest.Create(url);
using (var hr = (HttpWebResponse)(await h.GetResponseAsync()))
{
using (var s = hr.GetResponseStream())
{
using (var f = new FileStream(saveTo, FileMode.Create, FileAccess.Write, FileShare.None))
{
int bytesCount = 0;
byte[] buf = new byte[2048]; //<------------------------------
while ((bytesCount = await s.ReadAsync(buf, 0, buf.Length)) > 0)
{
await f.WriteAsync(buf, 0, bytesSize);
// Update UI : downloaded size, percent,...
}
}
}
}