2016-05-18 3 views
0

Ich verwende einen WebClient und lade gleichzeitig 4 Dateien herunter. Die Dateien werden parallel heruntergeladen und ich kann sehen, dass sich die Dateigröße im Ordner ändert. Jetzt möchte ich den Fortschrittsbalken für jede einzelne Datei anzeigen. Hier ist, was ich bisher versucht habe, aber der Fortschritt ist nicht passiert. Kann jemand bitte helfenWie man einzelne ProgressBar für parallelen Download zeigt?

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
      System.Net.ServicePointManager.DefaultConnectionLimit = 10; 
      List<String> files = new List<String>(); 
      String localPath = ""; 
      files.Add(file1); 
      files.Add(file2); 
      files.Add(file3); 
      files.Add(file4); 

      foreach (String fi in files) 
      { 
       localPath = "C:\\Download\\" + fi.Split('/')[5].ToString(); 
       WebClient client = new WebClient(); 

       client.DownloadProgressChanged += (sender1, e1) => client_DownloadProgressChanged(sender1, e1, z); 

       client.DownloadFileAsync(new Uri(fi), localPath, count); 
       count += 1; 
      } 
    } 

void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e, int RowNumber) 
     { 
      ProgressBar[] pb = new ProgressBar[4]; 

      pb[RowNumber-1] = new ProgressBar(); 
      pb[RowNumber-1].Width = 400; 
      pb[RowNumber-1].Height =20; 
      pnl.Children.Add(pb[RowNumber-1]); 
      pb[RowNumber-1].Value = e.ProgressPercentage; 
     } 

Antwort

0

Sie hier mehrere Möglichkeiten. Die beste Lösung wäre

  1. Verwenden Sie zusätzliche Parameter in DownloadProgressChangedEventHandler Methoden für jeden Dateinamen. Schauen Sie, wie Sie mit diesen verschiedenen here
  2. Gebrauch machen können DownloadProgressChangedEventHandler
  3. Viele andere Optionen, dh Parallel.ForEach

ersten Lösungscode (nicht getestet - ich habe nicht den Zugriff auf die IDE jetzt) ​​

List<String> files = new List<String>(); 
List<ProgressBar> pbs = new List<ProgressBar>(); 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    System.Net.ServicePointManager.DefaultConnectionLimit = 10; 
    String localPath = ""; 
    files.Add(file1); 
    files.Add(file2); 
    files.Add(file3); 
    files.Add(file4); 

    foreach (String fi in files) 
    { 
     ProgressBar pb = new ProgressBar(); 
     pb.Width = 400; 
     pb.Height =20; 
     pnl.Children.Add(pb); 
     pbs.add(pb); 

     localPath = "C:\\Download\\" + fi.Split('/')[5].ToString(); 
     WebClient client = new WebClient(); 

     client.DownloadProgressChanged += (sender1, e1) => client_DownloadProgressChanged(sender1, e1, fi); 

     client.DownloadFileAsync(new Uri(fi), localPath, count); 
     count += 1; 
    } 
} 


void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e, string fi) 
{  
    int pbNumber = files.IndexOf(fi);   
    pbs[pbNumber].Value = e.ProgressPercentage; 
} 
+0

Ok Ich ersetzte die Zeile, um zusätzliche Parameter zu übergeben, jedoch gibt es Fehler client.DownloadProgressChanged + = (Absender, e) => client_DownloadProgressChanged (Absender, e, z); Ein lokaler variabler Absender kann in diesem Bereich nicht deklariert werden. – SSK

+0

Können Sie meinen Code ändern, um einen dieser – SSK

+0

"Ein lokaler variabler Absender kann nicht in diesem Bereich deklariert werden" ist, weil Sie 1. Methode 'Button_Click" -Parameter namens Absender haben. Ändern Sie einfach den Namen der doppelten Variablennamen –

Verwandte Themen