2013-05-13 17 views
11

İnternet'ten birden fazla dosya indirmeye çalışıyorum ve hepsinin bitirmesi için bekliyorum. Bu, çalışmakta olduğum bir C# konsol uygulamasıdır, dolayısıyla ilerleme çubuğu işleyicisi gerekli olmamalıdır. Bununla birlikte, şu anda tüm dosyalar indirilmemiş olsa bile şu anda kod yürütmeye devam ediyor.Birden çok dosyayı uyumsuz olarak indirin ve kodun geri kalanını yürütmeden önce bunların tamamlanmasını bekleyin

  • 1.Her dosya indirme!
  • 2.Bileşmiş Dosyayı İndir A
  • 3.Finished Tüm dosyaları indirme!
  • 4.Finished tüm zaman uyumsuz indir dosyaları bittiğinde yaşına kadar bekleyeceğini Nasıl Dosya B
  • 5.Finished İndirilmesi Dosya C

indiriliyor. WebClient arasında

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

cevap

32

DownloadFileAsync/DownloadFileCompleted üye Event-based Asynchronous Pattern kullanın. async ve await kullanmak istiyorsanız, Task-based Asynchronous Pattern kullanıyor olmalısınız.

Bu durumda, örneğin DownloadFileTaskAsync member, kullanmalısınız:

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

sizin Context.listOfLocalDirectories.Add ve Errors.printError yöntemleri ÅŸan olması gerektiğini lütfen unutmayın.

+0

Başınız için teşekkürler. LocalDirectories iş parçacığı güvenli olduğundan emin olun kendi tamamlama olay işleyicisi de ekledi. Tüm yardımlarınız için teşekkür ederim. Bu ayrıca diğer async görevlerimdeki sorunları da anlamama yardımcı oldu. – user2100493

+0

Bu özellik şu adresten kullanılabilir: 4.5 – Natxo

+0

İstenmeyen dosya indirilemediğinde URL indirilemiyor mu? –

İlgili konular