上传文件时的C#内存分配

Sha*_*eKm 4 c# asp.net-mvc asp.net-mvc-3

问题与在MVC中上传文件有些相关.

上传文件时如何分配内存?

[HttpPost]
    public ActionResult FileUpload(string qqfile)
    {
            var stream = Request.InputStream;
Run Code Online (Sandbox Code Playgroud)

假设有人正在上传一个100 MB的文件,一旦Request.InputStream收到它会发生什么?

编辑:

Request.InputStream处理和处理退出时会发生什么ActionResult

  • 流存储在哪里?内存分配?
  • 何时处理?什么时候处理Request.InputStream?
  • 如果我将流存储在变量保存到的变量中?
  • 一旦动作结果退出,"流"变量会发生什么?
  • 变量"stream"持有什么?,一个Request.InputStream的引用/指针?或"完整"的字节副本(假设为100MB)?

C.E*_*uis 5

Stream还设计为允许从数据源读取,而尚未收到所有数据.情况就是如此Request.InputStream.其他人,比如MemoryStream,直接包装内存缓冲区.

存储数据的确切位置取决于流的类型.Socket级别上有一个缓冲区,可以保留数据直到读取,或者IIS可以为您缓冲数据.

当您(或.NET,在这种情况下)处理Stream或垃圾收集器为您执行此操作时,缓冲区将被丢弃.套接字层当然只有在连接关闭后才释放其缓冲区 - 配置流并不总是处理底层缓冲区.

这些流的设计使您可以使用 - Stream数据 - 而无需担心底层缓冲区.谁负责处理流的一般规则是:你创建它?你处理它.

响应您的编辑:如果您将流存储在变量中,例如在ASP.NET会话中,一旦Request不再需要该对象,.NET将始终处理该流.您的变量仍将包含对该流的引用,但从中读取将引发该流ObjectDisposedException.

注意a Stream和缓冲区之间的区别- a Stream提供对任何类型缓冲区的读取和/或写入访问 - 甚至是包含尚未接收的数据的虚拟缓冲区.尝试从该缓冲区读取将阻止当前线程,直到(某些)数据被接收(或直到发生错误).

并且,为了完成混淆,您可以拥有一个从多个缓冲区读取的流,从同一缓冲区读取的多个流以及流包装流.