【发布时间】: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