为什么在编写多部分时我的应用程序的内存占用空间会爆炸

时间:2014-06-11 22:04:42

标签: c# .net httpwebrequest

我有这个c#(.NET 4.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的RAM上。当我上传100MB文件时,我的应用程序会跳转到120MB的RAM。当我上传700MB文件时,我的应用程序跳转到720MB的RAM。它似乎也没有收集垃圾。我分析了应用程序和stream.Write()是造成多余内存分配的原因。

这是泄漏吗?我该怎么办?

1 个答案:

答案 0 :(得分:0)

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

您可以尝试强制请求流通过调用方法Flush将数据写入基础网络流,或者尝试将AllowWriteStreamBuffering的属性WebRequest设置为{ {1}}。