WebClient gesamter Downloadfortschritt für alle Dateien

  • VB.NET
  • .NET (FX) 4.0

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von StoneAge.

    WebClient gesamter Downloadfortschritt für alle Dateien

    Hallo Zusammen,

    ich verwende in meinem Programm (WPF, Visual Basic, Net4.0) einen Webclient zum downloaden mehrerer Dateien.
    Als visuelles Mittel verwende ich eine Image-Box und rechne beim Download im DownloadprogressChanged die Breite der Box aus.
    Für die einzelnen Dateien funktioniert das auch super, nur leider nicht als Gesamt-Anzeige.

    Die Gesamtanzeige rechnet sich aus dem BytesReceived und einer Variable(bereits heruntergeladene Menge) aus.

    Rein logisch funktioniert das ganze auch, nur habe ich das gefühl, dass der DownloadprogressChanged nach dem DownloadCompleted noch weiter läuft, denn genau beim Wechsel zur nächsten Datei macht die Width der Imagebox immer einen riesen Sprung nach vorn und geht dann wieder zurück.

    Ich habe den einen Rechenbefehl mal auskommentiert, nicht dass die Box noch irgendwo her eine Width bestimmt bekommt, ist aber auch nicht der Fall.

    Kann mit jemand sagen ob ich hier einen Denkfehler habe oder einen Tipp wie ich das am besten lösen könnte?

    Dankeschön!
    Es wäre schon, wenn Du den Code zum Download posten könntest, dann könnte es ein wenig besser nachvollziehen und wir können Dich gezielter auf mögliche Fehler hinweisen.

    Die Gesamtanzeige rechnet sich aus dem BytesReceived und einer Variable(bereits heruntergeladene Menge) aus.

    Gehen wir davon aus, dass Du den Download für die Datei 2 erst beginnst, wenn Du den Download für die Datei 1 abgeschlossen hast.
    Und das wir nicht wissen, wie groß die einzelnen Dateien sind, bis wir den Download starten.

    Quellcode

    1. P = ( 2 + 20/100 ) / 6 * 100

    Da wir also nicht wissen, wie viele Bytes für alle Dateien zusammen downgeloadetn werden müssen, sagen wir das eine nicht geladene Datei 0 ist und eine Geladene 1.
    Bei 6 Dateien, wovon bereits 2 downgeloadet, wurden und der Download der 3. Datei bei 20% ist hätten wir bei der Vorgehensweise ein Fortschritt von ungefähr von 36.7%.

    VB.NET-Quellcode

    1. ​Structure File
    2. Public fileName As String
    3. Public address As Uri
    4. End Structure

    VB.NET-Quellcode

    1. Dim index As Integer = 0
    2. Dim webClient As New WebClient()
    3. Dim files As New List(Of File)()
    4. files.Add(New File() With { Key .address = New Uri("http://..."), Key .fileName = "...." })
    5. files.Add(New File() With { Key .address = New Uri("http://..."), Key .fileName = "...." })
    6. files.Add(New File() With { Key .address = New Uri("http://..."), Key .fileName = "...." })
    7. webClient.DownloadProgressChanged += Sub(sender As Object, e As DownloadProgressChangedEventArgs)
    8. Dim percent As Double = (index + CDbl(e.ProgressPercentage) / 100.0) / files.Count * 100.0
    9. System.Diagnostics.Debug.WriteLine(percent + "%")
    10. End Sub
    11. webClient.DownloadFileCompleted += Sub(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs)
    12. index += 1
    13. If index <> files.Count Then
    14. webClient.DownloadFileAsync(files(index).address, files(index).fileName)
    15. End If
    16. End Sub
    17. webClient.DownloadFileAsync(files(index).address, files(index).fileName)

    Auch wenn es dahingeschmiert ist, sollte es zu verstehen geben, was ich meine.
    Hallo,

    wie Eddy schon erkannt hat. Ich frage vorher die komplette Liste nach der Größe ab und addiere sie, somit hab ich die Gesamtgröße und kann damit einen einfachen Dreisatz machen.
    Außerdem wird jede Datei nacheinander heruntergeladen, richtig.

    Der Code an sich funktioniert, da brauch ich keine Hilfe. Das Problem, das ich habe ist: Meine ImageBox am Ende des Downloads einer Datei immer einen großen Sprung nach vorn machen und dann beim nächsten Download wieder zurück zur richtigen Position springt. Mir kommts so vor, dass der 'DownloadProgressChanged' noch weiterarbeitet, obwohl der Download abgeschlossen ist.

    VB.NET-Quellcode

    1. Private Sub DownloadWC_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs) Handles DownloadWC.DownloadProgressChanged
    2. aktGroesse = e.TotalBytesToReceive
    3. pb_gesamtdownload.Width = 380 * (e.BytesReceived + BereitsGroesse) / GesamtDownloadGroesse
    4. End Sub
    5. Private Sub DownloadWC_DownloadFileCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles DownloadWC.DownloadFileCompleted
    6. BereitsGroesse = BereitsGroesse + aktGroesse
    7. End Sub