Problem mit WebClient

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Linkai.

    Problem mit WebClient

    Hallo,

    Ich habe eine mit Dateinamen gefüllte Listbox. Diese wird mit einer For Each Schleife abgearbeitet, und die eingetragenen Dateien werden heruntergeladen. Jetzt habe ich allerdings das Problem, dass der Webclient nicht wartet, bis ein Download abgeschlossen ist. Also er versucht viele Dateien auf einmal zu Downloaden, und da er nur eine gleichzeitig herunterladen kann, gibt es einen Fehler :(

    Ich habe es schon mit

    VB.NET-Quellcode

    1. While Not wc.IsBusy()
    probiert. Aber da wird dann die hälfte übersprungen.

    Ich suche als einen Befehl, wo das Programm angehalten wird, solange der webclient nicht "busy" ist :)

    Ich hoffe ihr könnt mir helfen

    Mit freundlichen Grüßen

    Niklas
    Du brauchst das Event Webclient_DownloadFileCompleted Das wird logischerweise ausgelöst wenn ein Download fertig ist.
    Aus diesem Event rufst du dann immer die Download Sub wieder auf. Sowas hier:

    VB.NET-Quellcode

    1. Dim WithEvents HttpClient As New WebClient
    2. Dim Reihe As Integer
    3. Dim los As New List(Of String) ' URIs
    4. Private Sub downLoad()
    5. Dim link As String = los(Reihe)
    6. Dim sLocalFile As String = "C:\Temp"
    7. HttpClient.DownloadFileAsync(New Uri(link), sLocalFile)
    8. End Sub
    9. Private Sub HttpClient_DownloadFileCompleted(ByVal sender As Object, ByVal _
    10. e As System.ComponentModel.AsyncCompletedEventArgs) Handles _
    11. HttpClient.DownloadFileCompleted
    12. Reihe += 1
    13. If Reihe < los.Count-1 Then downLoad()
    14. End Sub

    ersetze die Liste durch dein Listview.
    Es geht wahrscheinlich noch eleganter und kürzer aber es ist ein gangbarer Weg.
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Snaptu“ ()

    Musst du jedes File im selben Zug entpacken oder genügt es wenn du zuerst alles Downloadest und dann erst entpackst.
    Theoretisch denke ich kann man schon das entpacken auch in dieses Event packen dazu müsstest du dann aber bevor du hochzählst warten bis
    die Datei entpackt ist.
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Niklas schrieb:

    Ich suche als einen Befehl, wo das Programm angehalten wird, solange der webclient nicht "busy" ist

    Du meinst, solange er beschäftigt (busy) ist, oder? :)
    Ironischer weise gibt es exakt so einen Befehl. Die Methode würde dann so aussehen:

    VB.NET-Quellcode

    1. Public Async Sub DownloadSomething()
    2. Using wc = New WebClient() With {.Proxy = Nothing}
    3. Await wc.DownloadFileTaskAsync("Link", "Pfad")
    4. 'Hier ist die Datei jetzt fertig heruntergeladen
    5. 'Hier einfach die Datei dann entpacken etc.
    6. End Using
    7. End Sub


    Voraussetzung ist, dass du das .Net Framework 4.5 eingestellt hast. Das ist im Gegensatz zu diesen DownloadFileComplete-Events wesentlich lesbarer und schönerer Code. Probier das doch mal ;)
    Wenn dich das interessieren sollte, gibt es hier ein gutes Tutorial von @ErfinderDesRades: Async, Await und Task
    Mfg
    Vincent

    Hey,

    Hab jetzt aber schon recht viel mit dem "alten" Verfahren gemacht, und möchte jetzt nicht alles ändern :D

    @Snaptu hast du eine Lösung für mein Problem?

    Edit: Ich war mal wieder zu doof zum lesen :S

    Theoretisch denke ich kann man schon das entpacken auch in dieses Event packen dazu müsstest du dann aber bevor du hochzählst warten bis
    die Datei entpackt ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niklas“ ()

    Niklas schrieb:

    parallel / nacheinander herunterlädt
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Für deine Progressbar: du zählst die Anzahl der zu herunterladenen Dateien und setzt das max.
    Nachdem eine Datei runtergeladen wurde, fügst du im Download-Completed event die zeile Progressbar.value += 1 ein
    So hast du dann eine Anzeige. Zum Entpacken das gleiche spiel.


    du machst ne sub die aufgerufen wird, nachdem der letzte Download vollzogen ist, worin du dann file für file entpackst.
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:

    VB.NET-Quellcode

    1. Dim count As Integer
    2. Dim link As String
    3. Dim completelink As String
    4. Dim wc As New Webclient
    5. Public Sub download()
    6. link = Listbox1.Items(count)
    7. completelink = "PFAD" + link
    8. wc.DownloadFileAsync(New Uri(completelink), link)
    9. End Sub
    10. Private Sub wc_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles wc.DownloadFileCompleted
    11. If count < UpdateBox.Items.Count Then
    12. count = count + 1
    13. download()
    14. End Sub