バックグラウンド転送 API を使用する場合、現在のデータ転送を反復処理して、終了 (システム シャットダウン) 後にアプリを再起動した後、データ転送を再開する必要があります。進行状況の情報を取得し、データ転送をキャンセルできるようにするには、AttachAsync を使用してアタッチする必要があります。
私の問題は、データ転送が終了したときにのみ AttachAsync が返されることです。これは、いくつかのシナリオでは理にかなっています。ただし、複数のデータ転送がある場合、リスト内の次の転送は、現在アタッチされている転送が終了するまで開始されません。この問題に対する私の解決策は、AttachAsync().AsTask() が返す Task を従来の方法で処理することでした (await ではなく継続を使用します)。
IReadOnlyList<DownloadOperation> currentDownloads =
await BackgroundDownloader.GetCurrentDownloadsAsync();
foreach (var downloadOperation in currentDownloads)
{
Task task = downloadOperation.AttachAsync().AsTask();
DownloadOperation operation = downloadOperation;
task.ContinueWith(_ =>
{
// Handle success
...
}, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.FromCurrentSynchronizationContext());
task.ContinueWith(_ =>
{
// Handle cancellation
...
}, CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled,
TaskScheduler.FromCurrentSynchronizationContext());
task.ContinueWith(t =>
{
// Handle errors
...
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());
}
それはうまくいきます(実際のコードでは、ダウンロードをListBoxに追加します)。ループはすべてのダウンロードを反復し、StartAsync を実行します。ただし、ダウンロードは実際にはすべて同時に開始されるわけではありません。一度に実行されるのは 1 つだけであり、それが終了した場合にのみ、次のものが続行されます。
この問題の解決策はありますか?