Загрузите изображение, используя наименьшее количество памяти
Я разрабатываю приложение для WP8. В ScheduledTaskAgent
Мне нужно загрузить изображение из Интернета, сохранить его в хранилище, после чего я загружаю то же изображение и выполняю некоторую обработку. Я сталкиваюсь с ужасом OutOfMemoryException
, Если я уберу часть "загрузить и сохранить изображение" (используя уже сохраненное изображение), все будет работать. Если я просто скачаю и сохраню, все будет работать. Может быть, в первом расписании я могу сохранить его, во втором процессе. Но я не понимаю, где или почему мое загрузочное изображение хранит память, так что, может кто-нибудь предложить мне лучший способ сделать это? Вот мой фактический код:
private async Task GetImage(string url)
{
using (var http = new HttpClient())
{
var clientResponse = await http.GetByteArrayAsync(url);
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(lockFilename, Windows.Storage.CreationCollisionOption.ReplaceExisting);
using (var fs = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
{
var outStream = fs.GetOutputStreamAt(0);
using (var dataWriter = new Windows.Storage.Streams.DataWriter(outStream))
{
dataWriter.WriteBytes(clientResponse);
await dataWriter.StoreAsync();
dataWriter.DetachStream();
await outStream.FlushAsync();
outStream.Dispose();
fs.Dispose();
}
}
}
}
1 ответ
Используя HttpClient.GetStreamAsync, вы получите доступ непосредственно к сетевому потоку и сможете скопировать этот поток в файловый поток. Это должно уменьшить потребление памяти.