2013-10-29 10 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 Store एप में गैर-पृष्ठभूमि-सक्षम डाउनलोड के लिए कुछ विकल्प हैं। सबसे सरल है Windows.Web.Http.HttpClient - here's a good primer इसका उपयोग कैसे करें। हालांकि, यह केवल विंडोज 8.1 ऐप्स में उपलब्ध है, विंडोज़ 8.0 नहीं। यदि आपको Windows 8.0 संगतता की आवश्यकता है, तो विशिष्ट लेकिन समान नामित System.Net.Http.HttpClient शायद जाने का तरीका है। हैरिसन ने पहले ही the relevant Quickstart documentation पर एक लिंक प्रदान किया है।

यदि आप वास्तव में पृष्ठभूमि डाउनलोड क्षमता चाहते हैं, तो कृपया अपने प्रश्न को और परिदृश्य में सटीक रूप से प्रतिबिंबित करने के लिए संशोधित करें। कई पृष्ठभूमि डाउनलोड को एक साथ शुरू करने के लिए पृष्ठभूमिडाउनलोडर का उपयोग करना निश्चित रूप से संभव है और उनमें से प्रत्येक को प्रगति और समापन हैंडलर संलग्न करना संभव है, लेकिन यह आपके प्रश्न में परिदृश्य के लिए सबसे अच्छा समाधान नहीं लगता है।


अब जब आपने अपना उपयोग स्पष्ट किया है, तो समस्या अधिक स्पष्ट है। आपकी 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

पृष्ठभूमि ट्रांसफर शायद एक उचित विकल्प है। कृपया अपने हैंडलडाउनलोडएसिंक विधि की परिभाषा पोस्ट करें। इसे देखने के बिना निश्चित रूप से कहना असंभव है, लेकिन यह संभव है कि जो हो रहा है वह है 'हैडलडाउनलोडएसिंक (डाउनलोड, सत्य)' कॉल वास्तव में प्रत्येक डाउनलोड के लिए ** ** ** की प्रतीक्षा कर रहा है, जो आपको बताएगा कि आप केवल क्यों देखते हैं किसी भी समय किसी एक पर। –

+0

System.Net। ** एचटीपी ** .HttpClient :) – kiewic