2013-10-29 3 views
5

앱 시작 (처음 실행) 할 때 다운로드해야하는 파일이 있습니다. 나는 윈도우 8 의 백그라운드 다운로더를 사용하고 이것은 내가 그것을 사용하는 방법입니다 백그라운드 다운로더 창 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();를 사용하려고

. 그래서 비동기 적으로 시작할 수 있도록 위의 대기 연산자를 제거했습니다.

그러나 진행률 표시 줄을 설정할 수 있도록 모든 파일이 완료되면 알 필요가 있습니다.

여러 파일을 다운로드하고 모든 파일이 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

사실 나는 단지 한 번 (첫 번째 실행) 그들을 다운로드하고 싶습니다. 그러나 내가 종료하고 재개 할 때 단 하나의 백그라운드 다운로드 만 발견됩니다. – user2932696

+0

BackgroundTransfer는 아마도 합리적인 선택 일 것입니다. HandleDownloadAsync 메서드의 정의를 게시하십시오. 그것을 보지 않고 확실하게 말할 수는 없지만 일어나는 일은 '다운로드 HandleDownloadAsync (download, true)'호출이 실제로 각 다운로드를 ** 마무리 **로 기다리는 것이므로 그 이유 만 설명합니다 어떤 주어진 시간에 하나. –

+0

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