gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:06:35 25 4
gpt4 key购买 nike

问题与在 MVC 中上传文件有关。

上传文件时内存是怎么分配的?

[HttpPost]
public ActionResult FileUpload(string qqfile)
{
var stream = Request.InputStream;

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

编辑:

当处理退出 ActionResult 时,流和 Request.InputStream 会发生什么?

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

最佳答案

Stream 旨在允许在尚未接收到所有数据时从数据源读取数据。 Request.InputStream 就是这种情况。其他的,例如 MemoryStream,直接包装内存缓冲区。

数据存储的具体位置取决于流的类型。在 Socket 级别有一个缓冲区,数据可能会一直保存到它被读取,或者 IIS 可能会为您缓冲它。

当您(或 .NET,在本例中)处理流时,或者当垃圾收集器为您执行此操作时,缓冲区被处理掉。套接字层当然只会在连接关闭后释放其缓冲区 - 处置流并不总是处置底层缓冲区。

流的设计让您可以只使用它 - 数据的 Stream - 而不必担心底层缓冲区。谁负责处理流的一般规则是:你创建它?你处理掉它。

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

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

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

关于上传文件时的C#内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14932496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com