我有这个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()是造成多余内存分配的原因。
这是泄漏吗?我该怎么办?
答案 0 :(得分:0)
默认情况下,方法GetRequestStream
返回的流似乎是写缓冲的。加上相对较快的磁盘读取速度和较慢的写入网络接口,可以将几乎完整的文件存储在内存中。
您可以尝试强制请求流通过调用方法Flush
将数据写入基础网络流,或者尝试将AllowWriteStreamBuffering
的属性WebRequest
设置为{ {1}}。