C# 为什么当我编写多部分时,我的应用程序的内存占用会爆炸

C# 为什么当我编写多部分时,我的应用程序的内存占用会爆炸,c#,.net,httpwebrequest,C#,.net,Httpwebrequest,我有一个c.NET4.0应用程序,它使用多部分表单请求从文件系统上传本地文件。以下是请求流: Stream stream = webrequest.GetRequestStream(); 下面是我如何使用流上传文件: byte[] headerbytes = Encoding.UTF8.GetBytes(header); stream.Write(headerbytes, 0, headerbytes.Length); using (FileStream fileStream = new F

我有一个c.NET4.0应用程序,它使用多部分表单请求从文件系统上传本地文件。以下是请求流:

Stream stream = webrequest.GetRequestStream();
下面是我如何使用流上传文件:

byte[] headerbytes = Encoding.UTF8.GetBytes(header);
stream.Write(headerbytes, 0, headerbytes.Length);

using (FileStream fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
{
    byte[] buffer = new byte[1024];
    int bytesRead = 0;
    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
    { stream.Write(buffer, 0, bytesRead); }
}

byte[] newlineBytes = Encoding.UTF8.GetBytes("\r\n");
stream.Write(newlineBytes, 0, newlineBytes.Length);
“流”稍后在代码中关闭

我的应用程序运行时,在进程上的内存大约为20MB。当我上传一个100MB的文件时,我的应用程序会跳转到120MB的内存。当我上传一个700MB的文件时,我的应用程序会跳转到720MB的内存。它似乎也没有收集垃圾。我分析了应用程序和流。写入是导致内存分配过多的原因


这是个漏洞吗?我能做什么?

默认情况下,GetRequestStream方法返回的流似乎是写缓冲的。再加上相对较快的磁盘读取速度和较慢的网络接口写入速度,可以在内存中存储几乎完整的文件


您可以尝试通过调用Flush方法强制请求流将数据写入底层网络流,也可以尝试将WebRequest的AllowWriteStreamBuffering属性设置为false

如果您能告诉我们您是如何识别使用过的RAM,这将是很有帮助的。如果RAM在其他地方需要时被释放,那么大量使用未使用的RAM不一定是个问题。看到我的应用程序使用内存/CPU/磁盘总是很有趣。。。如何阻止它?对于内存-不要查看任务管理器,而是在.Net性能计数器上,使用内存探查器验证内存使用情况,或者至少是GC.Collect+。谢谢大家的建议。我正在阅读“内存-私有工作集”,它被定义为工作集的子集,专门描述一个进程正在使用的不能被其他进程共享的内存量。可能问题不在于写入另一个流,而在于请求本身?它还可能使用RAM进行文件缓存。您可以尝试注释fileStream.Read\stream.Write块,然后再次检查内存使用情况