1

我对 BackgroundTransferRequest RAM 效率有些怀疑,或者更可能是我遗漏了一些东西。

BackgroundTransferRequest 应该初始化一个 Web 请求(默认为 GET),然后将响应存储到由 DownloadLocation 指定的 IsolatedStorage,因此我们不应该打开任何包含结果的流,我们只有在 IsolatedStorage 中的物理文件。

简单、轻松、高效。

那么,为什么在 200 次成功下载后我仍然有 42k 占用的内存?

当然,如果我重新启动应用程序,我有 1k 占用的 ram 并且以前下载的文件仍然在独立存储上,所以我们可能在 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;
                }

非常感谢你!

4

1 回答 1

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 对象完成(成功与否),就应该处理它们,但您已经这样做了。

于 2012-04-14T17:09:55.167 回答