Descargar varios archivos de manera asincrónica y esperar a que todos ellos terminen antes de ejecutar el rest del código

Estoy tratando de descargar varios archivos de internet y espero a que todos ellos terminen. Esta es una aplicación de consola C # que estoy ejecutando, por lo que no es necesario ningún controlador de eventos de la barra de progreso. Sin embargo, actualmente continúa ejecutando el código aunque no se hayan descargado todos los archivos.

  • 1. Descargue todos los archivos!
  • 2.Finished Descargar archivo A
  • 3. Finalizado Descarga de todos los archivos!
  • 4.Luego de descargar el archivo B
  • 5.Luego de descargar el archivo C

¿Cómo esperarías hasta que todos los archivos de descarga asíncronos hayan finalizado?

private void DownloadMultipleFiles(List 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); } } } 

Los miembros DownloadFileAsync / DownloadFileCompleted de WebClient usan el patrón asincrónico basado en eventos . Si desea utilizar async y await , debe utilizar el Patrón asincrónico basado en tareas .

En este caso, debe usar el miembro DownloadFileTaskAsync , como tal:

 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 doclist) { await Task.WhenAll(doclist.Select(doc => DownloadFileAsync(doc))); } 

Tenga en cuenta que los métodos Context.listOfLocalDirectories.Add y Errors.printError deben ser seguros para la ejecución de los hilos.