2013-10-29 11 views
5

私はアプリのスタートアップ(最初の実行)でダウンロードする必要があるいくつかのファイルがあります。私は窓8 にバックグラウンドダウンローダーを使用しています これは私がそれを使用する方法です:私はBackgroundDownloader.GetCurrentDownloadsAsync();を使用しようとするとバックグラウンドダウンローダーのウィンドウ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();で検索し、すべてのダウンロードがいつ完了したかを知る必要があります。あなたは、特に、すべてのアプリの起動時にファイルを再度ダウンロードする必要がある場合

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); 
     } 
    } 
+0

あなたが見てきました[クイックスタート:ファイルのダウンロード](http://msdn.microsoft.com/en-us/library/windows/apps/jj152726.aspx改訂版は、次のようになります)? – Harrison

答えて

3

、あなたはBackgroundDownloaderを使うべきではない - それは、あなたのアプリが中断してから再起動します場合でも起こって続けるのダウンロードを必要とするシナリオを対象としています。次回にアプリが起動したときに再びファイルを再ダウンロードする場合は、アプリがなくなってもダウンロードを続けるだけでバッテリーを無駄にするだけです。

Windowsストアアプリでバックグラウンドではないダウンロードのオプションがいくつかあります。最も簡単なのは、Windows.Web.Http.HttpClient - here's a good primerの使い方です。ただし、Windows 8.1ではなく、Windows 8.0では使用できません。 Windows 8.0との互換性が必要な場合は、別名はSystem.Net.Http.HttpClientという名前が付いています。ハリソンは既にthe relevant Quickstart documentationへのリンクを提供しました。

本当にしたい場合背景ダウンロードの可能性がある場合は、シナリオをより正確に反映させるために質問を修正してください。 BackgroundDownloaderを使用していくつかのバックグラウンドダウンロードを同時に開始し、それぞれに進行状況と完了ハンドラを添付することは可能ですが、それはあなたの質問のシナリオにとって最良の解決策のようには聞こえません。


ここで、使用方法を明確にしたので、問題はより明確になりました。 HandleDownloadAsyncメソッドはダウンロードしたいプログレスハンドラを添付していますが、ダウンロードの完了を待っています。あなたは

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

を書くとき、あなたが次のダウンロードを開始する前に、あなたは、したがって、順番に各ダウンロードの完了に待っています。これはすぐにダウンロードのそれぞれを起動し、待つことなく、適切な進捗ハンドラを添付します - あなたは通話のすべてを行ってきました後まで

ここに解決策がにあるは、あなたのHandleDownloadAsync呼び出しの結果を待っていませんそれらのいずれかを完了すること。

BackgroundDownloader downloader = new BackgroundDownloader(); 

List<Task> downloadCompletionTasks = new List<Task>(); 
foreach (FileInfo info in infoFiles) 
{ 
    StorageFile file = /* ... */; 

    DownloadOperation op = downloader.CreateDownload(new Uri(info.Url), file); 

    // Consider moving this line into HandleDownloadAsync so you won't have to repeat 
    // it in the code that's handling the GetCurrentDownloadsAsync logic. 
    activeDownloads.Add(op); 

    // Starting the download, but not awaiting its completion yet 
    Task downloadCompletionTask = HandleDownloadAsync(op, true); 
    downloadCompletionTasks.Add(downloadCompletionTask); 
} 

// Now that we've got all the downloads started concurrently, we can wait until all of them complete 
await Task.WhenAll(downloadCompletionTasks); 
+0

実際には、一度だけダウンロードしたい(最初の実行)。しかし、私がシャットダウンして再開すると、バックグラウンドのダウンロードが1つしか見つかりません。 – user2932696

+0

BackgroundTransferはおそらく合理的な選択です。 HandleDownloadAsyncメソッドの定義を投稿してください。それを見ることなく確実に言うことは不可能ですが、起こっていることは、あなたの 'HandleDownloadAsync(ダウンロード、真)'呼び出しが**ダウンロードを完了するまで待っている可能性が高いです**いつでも1つ。 –

+0

System.Net。 ** Http ** .HttpClient :) – kiewic

関連する問題