BackgroundTransferService Ram Issue

时间:2012-04-12 09:18:08

标签: c# windows-phone-7

我对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;
                }

非常感谢你!

1 个答案:

答案 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对象,但是你已经这样做了。