后台传输服务内存问题
本文关键字:问题 内存 服务 传输 后台 | 更新日期: 2023-09-27 18:30:55
我对BackgroundTransferRequest RAM的效率有些怀疑,或者更可能是我错过了一些东西。
BackgroundTransferRequest 应该初始化一个 Web 请求(默认情况下为 GET),然后将响应存储到 DownloadLocation 指定的 IsolatedStorage,所以我们不应该打开任何包含结果的流,我们只是在 IsolatedStorage 中拥有物理文件。
简单、轻松、高效。
那么,为什么在 200 次成功下载后我仍然有 42k 占用的内存?
当然,如果我重新启动应用程序,我有 1k 占用的 ram,并且以前下载的文件仍在独立存储中,因此我们可能在 BackgroundTransferRequest 上有一些占用 ram 并且永远不会释放它的东西,尽管有处置调用。
如果我做错了什么,请纠正我。
您可以在下面看到用于添加和删除传输的代码片段。
初始化传输
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;
}
非常感谢!
使用 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 对象完成(成功与否),就应该释放它们,但您已经这样做了。