2013-05-13 44 views
11

我試圖從互聯網上下載多個文件並等待所有文件完成。這是我正在運行的C#控制檯應用程序,因此不需要進度條事件處理程序。但是,即使所有文件都沒有被下載,它目前只是繼續執行代碼。下載多個文件異步並等待它們全部完成,然後執行代碼的其餘部分

  • 1.下載所有文件!
  • 2.Finished下載文件A
  • 3.Finished下載所有文件!
  • 4.Finished下載文件B
  • 5.Finished下載文件C

你會如何等待,直到所有異步下載文件完成。

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

WebClientDownloadFileAsync/DownloadFileCompleted成員使用Event-based Asynchronous Pattern。如果你想使用asyncawait,你應該使用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.AddErrors.printError方法應該是線程安全的。

+0

謝謝你的擡頭。確保我的localDirectories是線程安全的,並添加了我自己的完成事件處理程序。感謝您的幫助。這也有助於我理解我的其他異步任務的問題。 – user2100493 2013-05-13 04:04:39

+0

這是可用的4.5 – Natxo 2016-09-13 15:10:00

+0

如果試圖從網站下載的URL返回404 Not Found? – 2017-12-16 20:35:47

相關問題