2013-05-13 9 views
11

Ich versuche mehrere Dateien aus dem Internet herunterzuladen und erwarte, dass alle fertig sind. Dies ist eine C# -Konsolenanwendung, die ich ausführe, daher sollte kein Fortschrittsbalken-Ereignishandler erforderlich sein. Zur Zeit wird jedoch weiterhin Code ausgeführt, obwohl nicht alle Dateien heruntergeladen wurden.Laden Sie mehrere Dateien asynchron herunter und warten Sie, bis alle fertig sind, bevor Sie den Rest des Codes ausführen.

  • 1.Download aller Dateien!
  • 2.Finished Download Datei A
  • 3.Finished Herunterladen aller Dateien!
  • 4.Finished Herunterladen Datei B
  • 5.Finished Herunterladen Datei C

Wie würden Sie warten, bis alle Asynchron-Download-Dateien fertig sind.

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

Antwort

32

Die DownloadFileAsync/DownloadFileCompleted Mitglieder WebClient die Event-based Asynchronous Pattern verwenden. Wenn Sie async und await verwenden möchten, sollten Sie die Task-based Asynchronous Pattern verwenden.

In diesem Fall sollten Sie die DownloadFileTaskAsync member, als solche verwendet werden:

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

Bitte beachten Sie, dass Ihre Context.listOfLocalDirectories.Add und Errors.printError Methoden THREAD sein sollte.

+0

Vielen Dank für den Kopf. Stellen Sie sicher, dass meine localDirectories threadsicher ist, fügte auch meinen eigenen Event-Handler hinzu. Danke für die Hilfe. Dies half mir auch, die Probleme mit meinen anderen asynchronen Aufgaben zu verstehen. – user2100493

+0

Dies ist seit 4.5 verfügbar. – Natxo

+0

Wird die Ausnahme zum Herunterladen der Datei fehlgeschlagen, wenn die URL, von der versucht wird, heruntergeladen zu werden, 404 not Found? –

Verwandte Themen