使用后台传输 API 时,我们必须遍历当前数据传输以在应用程序在终止(即系统关闭)后重新启动时再次启动它们。要获取进度信息并能够取消数据传输,必须使用 AttachAsync 附加它们。
我的问题是 AttachAsync 仅在数据传输完成时返回。这在某些情况下是有道理的。但是当有多个数据传输时,列表中的下一个传输将不会开始,直到当前附加完成。我对这个问题的解决方案是处理 AttachAsync().AsTask() 以经典方式返回的任务(不使用等待,而是继续):
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。但是下载并不是同时开始的。一次只有一个在运行,并且只有在它完成时才会继续下一个。
这个问题有什么解决办法吗?