下载期间的ASP.net内存使用情况
发布时间:2021-02-21 13:41:02  所属栏目:asp.Net  来源:互联网 
            导读:在我工作地点的ASP.net站点上,以下代码块负责处理文件下载(注意:此处未使用Response.TransmitFile,因为下载的内容是从zip文件流式传输的): private void DownloadFile( Stream stream){ int bytesRead; int chunkSize = 1048576; //1MB b
                
                
                
            | 
                         在我工作地点的ASP.net站点上,以下代码块负责处理文件下载(注意:此处未使用Response.TransmitFile,因为下载的内容是从zip文件流式传输的): private void DownloadFile( Stream stream)
{
        int bytesRead;
        int chunkSize = 1048576; //1MB
        byte[] readBuffer = new byte[chunkSize];
        while ((bytesRead = stream.Read(readBuffer,readBuffer.Length)) != 0)
            {
                if(!Response.IsClientConnected)
                    break;
                byte[] chunk = new byte[bytesRead];
                Array.Copy(readBuffer,chunk,bytesRead);
                Response.BinaryWrite(chunk);
                Response.Flush();
        }
        stream.Close();
} 
 我们的用户经常下载数百MB的文件,这可以很快地咀嚼服务器内存.我的假设是这是由于响应缓冲.那有意义吗? 我刚刚读到了Response对象的’buffer’属性.如果我将其设置为false,是否会阻止Response.BinaryWrite()调用缓冲内存中的数据?一般来说,在这种情况下限制内存使用的好方法是什么?也许我应该从zip流式传输到临时文件,然后调用Response.TransmitFile()? 编辑:除了可能的解决方案,我对上面代码中存在的内存使用问题的解释非常感兴趣.为什么这会消耗远远超过1MB,即使在每次循环迭代时调用Response.Flush?它只是在每次循环迭代时发生的不必要的堆分配(并且不会立即得到GC),或者还有其他工作吗? 解决方法这是我正在为此工作的一些代码.它使用8000字节缓冲区以块的形式发送文件.对大文件进行的一些非正式测试显示分配的内存显着减少.int BufferSize = 8000;
FileStream stream = new FileStream(fileName,FileMode.Open,FileAccess.Read);
try {
  long fileSize = stream.Length;
  long dataLeftToRead = fileSize;
  int chunkLength;
  buffer = new Byte[BufferSize];
  while (dataLeftToRead > 0) {
    if (!Response.IsClientConnected) {
      break;
    }
    chunkLength = stream.Read(buffer,BufferSize);
    Response.OutputStream.Write(buffer,chunkLength);
    Response.Flush();
    dataLeftToRead -= chunkLength;
  }
}
finally {
  if (stream != null) {
    stream.Close();
} 
 编辑以修复语法错误和缺失值 (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
相关内容
- asp.net-mvc – 帖子上的Mvc模型ID 0
 - asp.net – WebForm_DoCallback定义
 - asp.net-mvc – 在IIS 5.1上部署ASP.NET MVC(Windows XP)
 - 使用ASP.NET Web API 2.1配置依赖注入
 - ASP.NET UpdatePanel和Javascript __dopostback
 - asp.net-core – 在asp.net vnext中使用Startup.cs中的Conf
 - 在ASP.NET中,什么决定了HostingEnvironment.IsDevelopmentE
 - asp.net – 如何删除日历的最后一周
 - asp.net-mvc-3 – Azure网站上的RavenDb – 访问被拒绝
 - asp.net-mvc – 使用Repository/Service Pattern和MVC时缓存
 
