Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 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字节,如果在构建过程中未提供缓冲区大小,则使用该大小

当下载进度发生变化时,我正在编写一个下载程序支持更新UI(可观察到未发送项目的收集-批量下载),并继续下载,但不支持多段下载(因为每个项目的大小通常小于10MB)。

我运行大约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,...
            }
        }
    }
}