2013-05-13 8 views
11

Sto provando a scaricare più file da Internet e attendo che tutti finiscano. Questa è un'applicazione di console C# in cui sono in esecuzione, quindi nessun gestore di eventi della barra di avanzamento dovrebbe essere necessario. Tuttavia, al momento, continua a eseguire codice anche se tutti i file non sono stati scaricati.Scaricare più file asincroni e attendere che tutti terminino prima di eseguire il resto del codice

  • 1.Download di tutti i file!
  • 2.Finito Download File A
  • 3.Finitura Download di tutti i file!
  • 4.Finished download di file B
  • 5.Finished Il download del file C

Come ti aspettano fino a che tutti i file di download asincrono sono finiti.

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

risposta

32

I DownloadFileAsync/DownloadFileCompleted membri WebClient usa il Event-based Asynchronous Pattern. Se si desidera utilizzare async e await, si dovrebbe usare lo Task-based Asynchronous Pattern.

In questo caso, è necessario utilizzare il DownloadFileTaskAsync member, come ad esempio:

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

Si prega di notare che i Context.listOfLocalDirectories.Add e Errors.printError metodi dovrebbero essere threadsafe.

+0

Grazie per l'avviso. Assicurati che le mie localDirectories siano thread-safe aggiunga anche il mio gestore di eventi di completamento. Grazie per tutto l'aiuto. Questo mi ha anche aiutato a capire i problemi con gli altri miei compiti asincroni. – user2100493

+0

Disponibile dal 4.5 – Natxo

+0

L'eccezione non riesce a scaricare il file viene generato se l'URL che tenta di essere scaricato restituisce un 404 non trovato? –

Problemi correlati