1

BackgroundTransferRequest の RAM の効率について疑問があるか、何か不足している可能性があります。

BackgroundTransferRequest は Web 要求 (デフォルトでは GET) を初期化し、応答を DownloadLocation で指定された IsolatedStorage に格納する必要があるため、結果を含むストリームを開く必要はなく、IsolatedStorage に物理ファイルがあるだけです。

シンプル、簡単、効率的。

では、なぜ 200 回のダウンロードが成功したのに、まだ 42k の RAM を占有しているのでしょうか?

もちろん、アプリケーションを再起動すると、RAM が 1k 占有され、以前にダウンロードしたファイルがまだ分離ストレージに残っているため、dispose 呼び出しにもかかわらず、RAM を占有して決して解放しない BackgroundTransferRequest に何かがある可能性があります。

私が何か間違ったことをしている場合は、私を修正してください。

以下に、転送の追加と削除に使用されるコード スニペットを示します。

転送を初期化しています

                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 に答える