【问题标题】:Download an image using the least amount of memory使用最少的内存下载图像
【发布时间】:2014-03-12 02:49:20
【问题描述】:

我正在为 WP8 开发应用程序。在ScheduledTaskAgent 中,我需要从 Internet 下载图像,将其保存到存储中,然后加载相同的图像并进行一些处理。我正面临着可怕的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();
                }
            }
        }
    }

【问题讨论】:

  • 你需要把它流下来......不要批量下载整个东西。
  • 你为什么打电话给Dispose并使用using。你为什么打电话给Dispose而不是using
  • Simon,谢谢你的建议——这确实是正确的方法。我可以将所有图像加载到内存中并且它可以工作,问题是.net 没有在我想要的时候释放所有使用的内存......但是流式传输它(就像这里建议的那样:stackoverflow.com/questions/16140733/…)工作。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多