Problem: Webclient hängt sich beim zweiten Download auf

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Veritas.

    Problem: Webclient hängt sich beim zweiten Download auf

    Hallo alle zusammen!

    ich hab schon die Suchfunktion und Google ausgequätscht, aber leider nichts dergleichen gefunden :(

    Ich habe ein Programm geschrieben, das selbstständig nach Updates sucht.

    Es soll erstens eine Datei "version.txt" von meinem server laden und dann zusätzlich die datei "changelog.txt" herunterladen.
    Das Ganze soll durch einen Webclient funktionieren:

    Quellcode

    1. Public WithEvents Webdownload As New WebClient


    "version.txt" lade ich mit diesem code runter:

    Quellcode

    1. Webdownload.DownloadFileAsync(New Uri("meinserver.me.funpic.de/programme\meinprogramm\version.txt"), "version.txt")
    2. While Webdownload.IsBusy
    3. Application.DoEvents()
    4. End While


    DownloadFileAsync benutze ich, da DownloadFile aus irgendeinem Grund nicht funktioniert :(

    danach soll "changelog.txt" heruntergeladen werden:

    Quellcode

    1. Webdownload.DownloadFileAsync(New Uri("meinserver.me.funpic.de/programme\meinprogramm\changelog.txt"), "changelog.txt")
    2. While Webdownload.IsBusy
    3. Application.DoEvents()
    4. End While


    "version.txt" wird erfolgreich heruntergeladen und kann ausgelesen werden.

    Allerdings funktioniert der Download der zweiten Datei nicht. der Webclient bleibt bei 0% stehen.
    An der Datei selber liegt es auch nicht, da ich auch nicht 2 mal "version.txt" herunterladen kann, auch bei keiner anderen Datei funktioniert es. Auch My.Computer.Network.DownloadFile() funktioniert nur ein mal und hängt sich bei der zweiten Datei auf.

    Muss ich da noch irgendwas einstellen oder den Download mit einem Befehl abschließen oder ähnliches?
    Auch einen neuen Webclient zu definieren funktioniert nicht.

    Hoffentlich könnt ihr mir da weiterhelfen, ich probier schon seit Stunden rum :(

    While Webdownload.IsBusy
    Application.DoEvents()
    End While

    verwende doch Events, es sollte z.B. ein FileCompleted Event oder so ähnlich für den WebClient geben...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Mein zweites DownloadFileAsync wird erst nach dem ersten DownloadFileComplete Event ausgeführt.

    Und mit Webdownload = New Net.WebClient nach dem ersten Download funktioniert es leider auch nicht,
    es hängt sich genauso wieder bei der zweiten Datei auf.

    Einen neuen Webclient dafür zu definieren hilft leider auch nicht, der hängt sich dann auch auf.
    Natürlich! So stehen die Codezeilen zusammen:

    VB.NET-Quellcode

    1. Public WithEvents Webdownload As New WebClient
    2. Dim URLVersion as string = "meinserver.me.funpic.de/programme/meinprogramm/version.txt"
    3. Dim URLChangelog as string = "meinserver.me.funpic.de/programme/meinprogramm/changelog.txt"
    4. Private Sub DownloadFile(ByVal URL As String, ByVal Filename As String)
    5. Webdownload = New WebClient '<- Diese Zeile habe ich ergänzt, hat allerdings nichts gebracht
    6. FileComplete = False
    7. Webdownload.DownloadFileAsync(New Uri(URL), Filename)
    8. While Webdownload.IsBusy
    9. Application.DoEvents() '<- In dieser Schleife bleibt das Programm beim zweiten Download stehen und es wird eine 0-Byte große Datei erstellt.
    10. End While
    11. End Sub
    12. Private Sub SearchForUpdates()
    13. '----- Version laden -----
    14. DownloadFile(URLVersion, "version.txt") '<- Funktioniert
    15. Dim NewVersion As String = IO.File.ReadAllText("version.txt")
    16. LblVersion.Text = Application.Productversion
    17. LblNewVersion.Text = NewVersion
    18. '----- Changelog laden -----
    19. DownloadFile(URLChangelog, "changelog.txt") '<- Bleibt bei 0% stehen und erstellt eine 0-Byte Datei
    20. Dim Reader As IO.StreamReader = New IO.StreamReader("changelog.txt", System.Text.Encoding.Default)
    21. Dim NewChangelog As String = Reader.ReadToEnd 'Changelog auslesen
    22. Reader.Close()
    23. Txtchangelog.Text = NewChangelog '<- TextBox in der der Changelog angezeigt wird
    24. End Sub



    EDIT: Hatte ich noch vergessen: Die Sub wird im Form_Shown Event ausgeführt.
    lass doch endlich mal die Schleife weg...

    While Webdownload.IsBusy
    Application.DoEvents() '<- In dieser Schleife bleibt das Programm beim zweiten Download stehen und es wird eine 0-Byte große Datei erstellt.
    End While


    und mach das ganze mit Events...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Naja, die Schleife an sich funktioniert ja, was ja der erfolgreiche erste Download beweist.
    Ob ich nun das Programm für die Zeit, die der Download braucht, in der DoEvents Schleife halte und dann fortsetze
    oder es stoppe und wiederaufnehme, wenn der erste Download fertig ist, sollte eigentlich egal sein.

    Die Schleife habe ich deshalb genommen um das ganze in einer Sub laufen lassen zu können
    ohne viele Sprünge im Code zu haben.
    Die Sache mit dem Application.DoEvents() stört den Download nicht und ist auch nur drin,
    da der programmsynchrone Download (also Webclient.DownloadFile) aus einem mir unerfindlichen Grund nicht funktioniert.
    (Es wird auch dann nur eine 0-Byte Datei erstellt.)

    Nichtsdestotrotz habe ich es auch mal mit dem DownloadFileCompleted Event versucht, gleiches Resultat.

    Oder mit welchem Event würdest du das machen?