5

アプリの起動時 (初回実行時) にダウンロードする必要があるファイルがいくつかあります。Windows 8 でバックグラウンド ダウンローダーを使用しています。

BackgroundDownloader downloader = new BackgroundDownloader();

List<DownloadOperation> operations = new List<DownloadOperation>();
foreach (FileInfo info in infoFiles)
{
    Windows.Storage.ApplicationData.Current.LocalFolder;
    foreach (string folder in info.Folders)
    {
        currentFolder = await currentFolder.CreateFolderAsync(folder, CreationCollisionOption.OpenIfExists);       
    }
    //folder hierarchy created, save the file
    StorageFile file = await currentFolder.CreateFileAsync(info.FileName, CreationCollisionOption.ReplaceExisting);

    DownloadOperation op = downloader.CreateDownload(new Uri(info.Url), file);
    activeDownloads.Add(op);
    operations.Add(op);
}


foreach (DownloadOperation download in operations)
{
  //start downloads
  await HandleDownloadAsync(download, true);
}

使用しようとするBackgroundDownloader.GetCurrentDownloadsAsync();と、バックグラウンド ダウンロードが 1 つだけ検出されます。そのため、上記の await 演算子を削除して、非同期で開始できるようにしました。

ただし、進行状況バーを設定できるように、すべてのファイルがいつ終了するかを知る必要があります。

複数のファイルをダウンロードし、それらすべてを見つけてBackgroundDownloader.GetCurrentDownloadsAsync();、すべてのダウンロードがいつ完了したかを知る方法が必要です。

  private async Task HandleDownloadAsync(DownloadOperation download, bool start)
    {
        try
        {
            Debug.WriteLine("Running: " + download.Guid, NotifyType.StatusMessage);

            // Store the download so we can pause/resume.
            activeDownloads.Add(download);

            Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(DownloadProgress);
            if (start)
            {
                // Start the download and attach a progress handler.
                await download.StartAsync().AsTask(cts.Token, progressCallback);
            }
            else
            {
                // The download was already running when the application started, re-attach the progress handler.
                await download.AttachAsync().AsTask(cts.Token, progressCallback);
            }

            ResponseInformation response = download.GetResponseInformation();

            Debug.WriteLine(String.Format("Completed: {0}, Status Code: {1}", download.Guid, response.StatusCode),
                NotifyType.StatusMessage);
        }
        catch (TaskCanceledException)
        {
            Debug.WriteLine("Canceled: " + download.Guid, NotifyType.StatusMessage);
        }
        catch (Exception ex)
        {
            if (!IsExceptionHandled("Execution error", ex, download))
            {
                throw;
            }
        }
        finally
        {
            activeDownloads.Remove(download);
        }
    }
4

1 に答える 1