2017-01-02 3 views
0
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 1; i <= lines.Length; i++) 
    { 
     if (lines[i].Contains("Code")) 
     { 
      string countryCode = lines[i].Substring(15); 
      using (var client = new WebClient()) 
      { 
       client.DownloadFileCompleted += Client_DownloadFileCompleted; 
       Uri uri = new Uri("http://api.sat24.com/animated/" + countryCode + "/infraPolair/1/JerusalemStandardTime/1897199"); 
       client.DownloadFile(uri, @"c:\temp\" + countriesNames[countCountries] + ".gif"); 
      } 

      backgroundWorker1.ReportProgress(i * 100/lines.Length); 
      countCountries++; 
     } 
    } 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
    label1.Text = e.ProgressPercentage.ToString() + "%"; 
} 

Alle Gifs werden in Ordnung, aber es wird auf 97% bleiben. Ich könnte im Hintergrundarbeiter abgeschlossene Ereignis der Fortschrittsbalkenwert auf 100 setzen, aber das ist keine echte Lösung, denke ich.Warum die progressBar auf 97% und nie auf 100% kommt?

Ein weiteres Problem ist, wie kann ich mit dem ersten gif heruntergeladen werden? Es sind animierte Gifs und ich möchte, dass die erste heruntergeladen wird, um sie in PictureBox1 anzuzeigen. Soll ich dafür den WebClient-Download abgeschlossen durchführen?

Antwort

3

Ihr Code löst hier bei der letzten Iteration eine Ausnahme aus. und das ist Ihnen wahrscheinlich nicht bewusst.

for (int i = 1; i <= lines.Length; i++) 

Weil Sie 0-i < lines.Length laufen müssen. (Beachten Sie, dass Array-Indizes sind 0-basiert)

for (int i = 0; i < lines.Length; i++) 

Und auch den Bericht über die Fortschritte in diesem

backgroundWorker1.ReportProgress(i * 100/(lines.Length - 1)); 

Noch ein Hinweis ändern, die ich verpasst, die durch @ Peter erwähnt in seiner Antwort um die Fortschrittsanzeige außerhalb der if-Anweisung zu verschieben.

if (lines[i].Contains("Code") {...} 
backgroundWorker1.ReportProgress(i * 100/(lines.Length-1)); 
+0

Zu 98% mit diesen Änderungen. –

+0

@DanielDejunior überprüfen mit Debugger. Wahrscheinlich löst Ihr Code irgendwo eine Ausnahme aus. und im Grunde kann es nicht weitergehen. Setzen Sie den Haltepunkt und gehen Sie Schritt für Schritt, um zu sehen, wo Sie Fehler bekommen. –

-1

Ich könnte mich auf 100/lines.Length konzentrieren. Versuchen Sie (double)100/(double)lines.Length

1

Ihr Fortschritt ist in Ihrem wenn. Platziere es außerhalb des if und es wird den korrekten Prozess melden. Ich schätze, die letzten paar Zeilen enthalten nicht das Wort Code:

for (int i = 0; i < lines.Length; i++) 
{ 
    if (lines[i].Contains("Code")) 
    { 
     string countryCode = lines[i].Substring(15); 
     using (var client = new WebClient()) 
     { 
      client.DownloadFileCompleted += Client_DownloadFileCompleted; 
      Uri uri = new Uri("http://api.sat24.com/animated/" + countryCode + "/infraPolair/1/JerusalemStandardTime/1897199"); 
      client.DownloadFile(uri, @"c:\temp\" + countriesNames[countCountries] + ".gif"); 
     } 
     countCountries++; 
    } 
    backgroundWorker1.ReportProgress(i * 100/(lines.Length-1)); 
} 
+0

gute Nachricht. aber "i = 1; i <= line.Length' ist immer noch falsch. du hast vergessen, das zu beheben;) –

+0

Yepp du bist richtig, dann ist die Berechnung auch falsch, weil ich nie Länge sein werde (Länge-1). – Peter

Verwandte Themen