使用最少的内存下载图像

时间:2014-03-12 02:49:20

标签: c# windows-phone-8 async-await dotnet-httpclient

我正在为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 个答案:

答案 0 :(得分:0)

通过使用HttpClient.GetStreamAsync,您可以直接访问网络流,并可以将该流复制到文件流。这应该会减少内存消耗。