我对BackgroundTransferRequest RAM效率有一些疑问,或者更可能的是,我遗漏了一些东西。
BackgroundTransferRequest应初始化Web请求(默认为GET),然后将响应存储到DownloadLocation指定的IsolatedStorage,因此我们不应打开包含结果的任何流,我们只需要在IsolatedStorage中使用物理文件。
简单,轻松,高效。
然后,为什么在200次下载后我仍然有42k占用ram?
当然如果我重新启动应用程序,我有1k占用ram,以前下载的文件仍然在Isolated Storage上,所以我们可能在BackgroundTransferRequest上有一些东西占用ram而且从不释放它,尽管有一个dispose调用。
如果我做错了,请纠正我。
下面您可以看到用于添加和删除转移的代码段。
初始化转移
BackgroundTransferRequest transferRequest = new BackgroundTransferRequest(transfer.TransferUri);
transfer.RequestId = transferRequest.RequestId;
transferRequest.DownloadLocation = transfer.DestinationUri;
transferRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery;
BackgroundTransferService.Add(transferRequest);
完成,删除转移
BackgroundTransferRequest transferToRemove = BackgroundTransferService.Find(transferID);
if (transferToRemove != null)
{
BackgroundTransferService.Remove(transferToRemove);
transferToRemove.Dispose();
transferToRemove = null;
}
非常感谢你!
答案 0 :(得分:2)
使用BackgroundTransferService类时,必须非常小心对BackgroundTransferRequest对象的引用,以避免内存泄漏。
_BackgroundRequests = BackgroundTransferService.Requests;
之前的赋值将创建对BackgroundTransferRequest对象的新引用,因此您应该始终处置现有的对象以避免内存泄漏。
如果在您的代码中保留了对BackgroundTransferService.Requests列表的本地引用,那么在使用Requests属性时应始终处置旧引用。
foreach(var Request in _BackgroundRequests)
{
Request.Dispose();
}
_BackgroundRequests = BackgroundTransferService.Requests;
由于BackgroundTransferService允许最多排队5个BackgroundTransferRequest对象,因此可以尝试在BackgroundTransferService.Requests列表中使用Count()方法。
请记住,这会创建新引用并导致内存泄漏。最好的解决方案是保留当前排队传输的内部计数器,或者从不关心排队传输的数量,并处理当有太多请求排队时服务抛出的异常。
最后,一旦完成(成功与否),就应该处理BackgroundTransferRequest对象,但是你已经这样做了。