2013-05-13 4 views
11

मैं इंटरनेट से अनेक फ़ाइलों को डाउनलोड करने के लिए कोशिश कर रहा हूँ और उन सभी को समाप्त करने के लिए इंतजार के बाकी को क्रियान्वित करने से पहले समाप्त होने की प्रतीक्षा। यह एक सी # कंसोल एप्लिकेशन है जो मैं चला रहा हूं, इसलिए प्रगति पट्टी ईवेंट हैंडलर आवश्यक नहीं होना चाहिए। हालांकि यह वर्तमान में कोड निष्पादित करना जारी रखता है भले ही सभी फाइलें डाउनलोड नहीं की गई हैं।डाउनलोड एकाधिक फ़ाइलों async और उन सभी कोड

  • 1. सभी फ़ाइलों को डाउनलोड करना!
  • 2.Finished डाउनलोड फ़ाइल एक
  • 3.Finished सभी फ़ाइलों को डाउनलोड!
  • 4.Finished डाउनलोड कर रहा है फ़ाइल बी
  • 5.Finished डाउनलोडिंग फ़ाइल सी

आप कैसे का इंतजार करेंगे जब तक सभी async डाउनलोड फ़ाइलों पूरा कर लें। WebClient की

private void DownloadMultipleFiles(List<DocumentObject> doclist) 
    { 
     foreach(var value in doclist){ 
      try 
      { 
       using (WebClient webClient = new WebClient()) 
       { 
        string downloadToDirectory = @Resources.defaultDirectory + value.docName; 
        webClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
        webClient.DownloadFileCompleted += client_DownloadFileCompleted; 
        webClient.DownloadFileAsync(new Uri(value.docUrl), @downloadToDirectory); 

        //Add them to the local 
        Context.listOfLocalDirectories.Add(downloadToDirectory); 
       }   
      } 
      catch (Exception) 
      { 
       Errors.printError("Failed to download File: " + value.docName); 
      } 
     } 
    } 

उत्तर

32

DownloadFileAsync/DownloadFileCompleted सदस्यों Event-based Asynchronous Pattern का उपयोग करें। यदि आप async और await का उपयोग करना चाहते हैं, तो आपको Task-based Asynchronous Pattern का उपयोग करना चाहिए।

इस मामले में, आप इस तरह के रूप DownloadFileTaskAsync member, का उपयोग करना चाहिए:

private async Task DownloadFileAsync(DocumentObject doc) 
{ 
    try 
    { 
    using (WebClient webClient = new WebClient()) 
    { 
     string downloadToDirectory = @Resources.defaultDirectory + doc.docName; 
     webClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
     await webClient.DownloadFileTaskAsync(new Uri(doc.docUrl), @downloadToDirectory); 

     //Add them to the local 
     Context.listOfLocalDirectories.Add(downloadToDirectory); 
    }   
    } 
    catch (Exception) 
    { 
    Errors.printError("Failed to download File: " + doc.docName); 
    } 
} 

private async Task DownloadMultipleFilesAsync(List<DocumentObject> doclist) 
{ 
    await Task.WhenAll(doclist.Select(doc => DownloadFileAsync(doc))); 
} 

कृपया ध्यान दें कि आपके Context.listOfLocalDirectories.Add और Errors.printError तरीकों threadsafe होना चाहिए।

+0

हेड अप के लिए धन्यवाद। सुनिश्चित करें कि मेरी स्थानीय डायरेक्टरीज़ थ्रेड सुरक्षित है, मेरे स्वयं के पूर्णता ईवेंट हैंडलर को भी जोड़ा गया है। सारी मदद के लिए धन्यवाद। इससे मुझे अपने अन्य एसिंक कार्यों के साथ समस्याओं को समझने में भी मदद मिली। – user2100493

+0

यह 4.5 – Natxo

+0

के बाद से उपलब्ध है क्या अपवाद फ़ाइल डाउनलोड करने में विफल रहा है अगर यूआरएल रिटर्न से डाउनलोड करने का प्रयास कर रहा है तो 404 नहीं मिला? –

संबंधित मुद्दे