Мне нужно ПОСЛАТЬ 5 МБ-файл из ResourceIntensiveTask, где ОС устанавливает максимальное использование памяти 5 МБ. Так пытаясь передать поток прямо из хранилища, но поток, связанный с HttpWebRequest, продолжает расти. Это код:Проводка файла в буфере фонового агента/HttpWebRequest продолжает расти?
public void writeStream(Stream writer, string filesource, string filename)
{
var store = System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication();
var f = store.OpenFile(filesource, FileMode.Open, FileAccess.Read);
store.Dispose();
byte[] buffer = Encoding.UTF8.GetBytes(String.Format(@"Content-Disposition: form-data; name=""file""; filename=""{0}""\n", filename));
writer.Write(buffer, 0, buffer.Length);
buffer = Encoding.UTF8.GetBytes("Content-Type: application/octet-stream\n");
writer.Write(buffer, 0, buffer.Length);
long initialMemory = Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage;
buffer = new byte[2048];
int DataRead = 0;
do
{
DataRead = f.Read(buffer, 0, 2048);
if (DataRead > 0)
{
writer.Write(buffer, 0, DataRead);
Array.Clear(buffer, 0, 2048);
}
} while (DataRead > 0);
double increasedMemory = ((double)Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage - initialMemory)/1000000;
buffer = Encoding.UTF8.GetBytes("\n--" + boundary + "\n--");
writer.Write(buffer, 0, buffer.Length);
writer.Flush();
}
increasedMemory переменной отладки используются для получения дифференциальной памяти до и после того, как файл для чтения и передается на HttpWebRequest, и это дает почти точный размер файла (5 МБ) что означает, что память процесса увеличивается на 5 МБ.
Я также устанавливаю AllowReadStreamBuffering = false для HttpWebRequest.
Как сохранить память на низком уровне? Как загрузить большие файлы, когда ограничение использования памяти составляет 5 МБ?
У меня такая же проблема - «OutOfMemoryException» при загрузке больших файлов (но из приложения переднего плана). Может, кто-то может помочь. Начал 'bounty' – Ku6opr
Просто догадаться в этот момент (я не тестировал это), но вы пытались добавить' writer.Flush(); 'после' writer.Write() 'в цикле? – Nomad101
Да. Кроме того, попробовал «Thread.Sleep» в цикле дождаться загрузки данных – Ku6opr