2010-02-15 4 views
2

Je suis un peu confus pourquoi l'événement ne se déclenche pas lorsque le fichier a été téléchargé.L'événement DownloadFileCompleted ne se déclenche pas à l'intérieur pendant que la boucle C# .net

Le fichier qu'il télécharge lui-même parfaitement bien.

Je suppose qu'il y a une erreur dans la façon dont j'utilise ceci, en ce que l'événement ne se déclenche pas dans une boucle.

Merci pour toute aide quelqu'un peut me donner

class DownloadQueue 
{ 
    public List<string[]> DownloadItems { get; set; } 
    public int CurrentDownloads; 
    public int DownloadInProgress; 
    string url = @"http://www.google.co.uk/intl/en_uk/images/logo.gif"; 
    bool downloadComplete; 

    public DownloadQueue() 
    { 
     CurrentDownloads = 0; 
     DownloadItems = new List<string[]>(); 
     Console.Write("new download queue made"); 
    } 

    public void startDownloading(int maxSimulatiousDownloads) 
    { 
     downloadComplete = true; 
     DownloadInProgress = 0; 
     WebClient client = new WebClient(); 
     client.DownloadFileCompleted += 
        new AsyncCompletedEventHandler(this.downloadCompleteMethod); 


      while(DownloadInProgress != DownloadItems.Count) 
      { 
       if (downloadComplete == true) 
       { 
        downloadComplete = false;   

        client.DownloadFileAsync(new Uri(DownloadItems.ElementAt(DownloadInProgress).ElementAt(0).ToString()), DownloadItems.ElementAt(DownloadInProgress).ElementAt(1).ToString());       
       } 
      } 
     Console.Write("all downloads completed"); 
    } 

    private void downloadCompleteMethod(object sender, AsyncCompletedEventArgs e) 
    {    
     downloadComplete = true; 
     DownloadInProgress++; 
     Console.Write("file Downloaded"); 
    } 

    } 

Répondre

-1

Où que vous attendez l'appel à compléter DownloadFileAsync()? Que diriez-vous quelque chose comme

manualResetEvent AllDone = new mre(false) 

juste avant Console.Writeline

AllDone.WaitOne() 

Et en téléchargement complet

if (interlocked.decrement(ref downloadComplete) == 0) { AllDone.Set(); } 
-1

Très probablement il n'y a pas de temps pour le message à venir. Je soupçonne que si vous mettez un Application.DoEvents à la fin de votre boucle, il commencerait à déclencher les événements. Il est loin d'être idéal pour l'utiliser, mais avec le design que vous avez, je ne peux pas penser à un meilleur moyen.