У меня есть приложение С# (.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);
("поток" закрывается позже в коде ")
Мое приложение запускается, и он зависает около 20 МБ ОЗУ в процессе. Когда я загружаю файл размером 100 МБ, мое приложение переходит на 120 МБ ОЗУ. Когда я загружаю файл 700 МБ, мое приложение переходит на 720 МБ ОЗУ. Кажется, он тоже не собирает мусор. Я профилировал приложение и stream.Write() - это то, что вызывает избыточное выделение памяти.
Это утечка? Что я могу сделать?
Поток, возвращаемый методом GetRequestStream
, по умолчанию имеет GetRequestStream
записи по умолчанию. Вместе с относительно быстрым чтением с диска и медленной записью в сетевой интерфейс дает эффект сохранения почти полного файла в памяти.
Вы можете либо попытаться заставить поток запроса записать данные в базовый сетевой поток, вызвав метод Flush
либо попытаться установить для свойства AllowWriteStreamBuffering
WebRequest
значение false
.