File Downloader hängt sich auf

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von martinf.

    File Downloader hängt sich auf

    Hallo zusammen
    Mit folgendem Code kann man Dateien runterladen und den Download pausieren und wieder fortsetzen(resume).
    Der Code funktioniert bei einer langsamen Netzwerkverbindung problemlos.
    Hat man jedoch Gigabit Netzwerk so hängt sich die Applikation auf. Das heisst der Server mit der Datei welche runtergeladen werden soll befindet sich im gleichen Netzwerk.
    Was gibt es da für Lösungsansätze?
    Danke für eure Antworten.
    Gruss Martin

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Collections.Generic
    3. Imports System.ComponentModel
    4. Imports System.Data
    5. Imports System.Drawing
    6. Imports System.Linq
    7. Imports System.Text
    8. Imports System.Threading.Tasks
    9. Imports System.Windows.Forms
    10. Imports AltoHttp
    11. Public Class Form1
    12. Private httpDownloader As HttpDownloader
    13. Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    14. Dim DownloadFolder As String
    15. DownloadFolder = "c:\temp\" & "Download\"
    16. httpDownloader = New HttpDownloader(txtUrl.Text, $"{DownloadFolder}\\{System.IO.Path.GetFileName(txtUrl.Text)}")
    17. AddHandler httpDownloader.DownloadCompleted, AddressOf HttpDownloader_DownloadCompleted
    18. AddHandler httpDownloader.ProgressChanged, AddressOf HttpDownloader_ProgressChanged
    19. httpDownloader.Start()
    20. End Sub
    21. Private Sub HttpDownloader_ProgressChanged(ByVal sender As Object, ByVal e As AltoHttp.ProgressChangedEventArgs)
    22. progressBar.Value = CInt(e.Progress)
    23. lblPercent.Text = $"{e.Progress.ToString("0.00")} % "
    24. lblSpeed.Text = String.Format("{0} MB/s", (e.SpeedInBytes / 1024.0R / 1024.0R).ToString("0.00"))
    25. lblDownloaded.Text = String.Format("{0} MB", (httpDownloader.TotalBytesReceived / 1024.0R / 1024.0R).ToString("0.00"))
    26. lblStatus.Text = "Downloading..."
    27. End Sub
    28. Private Sub HttpDownloader_DownloadCompleted(ByVal sender As Object, ByVal e As EventArgs)
    29. Me.Invoke(CType(Function()
    30. lblStatus.Text = "Finished"
    31. lblPercent.Text = "100%"
    32. Return 0
    33. End Function, MethodInvoker))
    34. End Sub
    35. Private Sub btnPause_Click(sender As Object, e As EventArgs) Handles btnPause.Click
    36. If httpDownloader IsNot Nothing Then httpDownloader.Pause()
    37. End Sub
    38. Private Sub btnResume_Click(sender As Object, e As EventArgs) Handles btnResume.Click
    39. If httpDownloader IsNot Nothing Then httpDownloader.[Resume]()
    40. End Sub
    41. End Class


    CodeTags gesetzt ~VaporiZed
    Dateien

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    @martinf Willkommen im Forum. :thumbup:
    Ich habe eine 740410234 Byte lange Datei in ca. 2 Minuten mit Pause und resume runtergeladen, das Programm schnurrt wie ein Kätzchen, keinerlei Probleme.
    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!
    Ich habe noch einige Tests gemacht.
    Ich lade eine Datei mit der Grösse von 630 MB runter.
    Mit 200MBit's Download Speed läufts noch problemlos.
    Mit 300MBit's Download Speed hängt das Program, dieses ist dann nicht mehr bedeinbar und zeigt keine Daten zum Download mehr an.
    Betriebsystem ist Win10 Pro 21H2.
    @martinf Kannst Du mal den Link zu dieser Datei posten?
    Welches Studio verwendest Du?
    Wie gibst Du die Download-Geschwindigkeit vor?
    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!
    @RodFromGermany

    habe mit dieser Datei getestet
    chip.de/downloads/VMware-Player-Workstation_12994646.html

    Diese Datei lade ich mit meinen Program nicht von Internet runter sondern von einem lokalen Webserver.

    Ich verwende VS2022

    Ich geben den Speed mit VMware Workstation vor (Network Adapter -> Advanced)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „martinf“ ()

    @martinf Und wie bekommst Du den eigentlichen Download-Link aus dieser Seite raus?
    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!
    @martinf OK.
    Poste eine vollständige und belastbare Aufgabenstellung.
    Wie oft soll denn diese Datei geladen werden?
    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!
    @martinf OK.
    Tut mir leid, aber ich installiere keine Programme, um damit Fehler zu suchen.
    Kannst Du den Download nicht über den Firefox oder so machen?
    Du überwachst den Download mit einem FileSystemWatcher und bekommst gemeldet, wenn der Download beendet ist.
    docs.microsoft.com/de-de/dotne…ystemwatcher?view=net-6.0
    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!
    Danke für die Antwort
    Du müsstest das Programm nicht installieren es ist nur die hfs.exe zum starten

    Hier die Beschreibung meiner Anwendung.
    Meine Anwendung soll eine virtuelle Maschine (Dateigrösse 50GB und grösser) von einem Webserver in unserem internen Netzwerk runterladen.

    Die Datei welche ich runterlade ist Passwortgeschützt und wird dann mittels meiner Anwendung entpackt.

    Firefox ist leider keine Alternative das wir dann für unseren 600 User eine Anleitung schreiben müssten, was zu vermehrten support führen würde.

    martinf schrieb:

    nur die hfs.exe zum starten
    und dann noch der Server, wo die Datei liegt.
    Das ist eine Umgebung, die ich hier nicht habe und nicht nachstellen werde.
    Probier mal statt des HttpDownloader den WebClient und lade die Datei asynchron:
    docs.microsoft.com/de-de/dotne…et.webclient?view=net-6.0
    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!
    Leider habe ich mich zu früh gefreut
    Beim Beispiel (AdvancedDownloadClient 1.1.0) ist leider die Download Performance sehr schlecht max. 150 MBit/s da unsere Dateien sehr gross sind (ca. 100GB) ist es wichtig das es schneller geht.
    Ansosten wartet der User stundenlang.

    martinf schrieb:

    ...
    Mit 200MBit's Download Speed läufts noch problemlos.
    Mit 300MBit's Download Speed hängt das Program, dieses ist dann nicht mehr bedeinbar und zeigt keine Daten zum Download mehr an.
    ...

    Ich vermute mal das hängt mit dem ProgressChanged Event zusammen, bei höheren Datenraten wird das Event wesentlich öfter ausgelöst, was im GUI-Thread läuft und damit das GUI blockiert.
    Anstatt jedes mal das GUI zu aktualisieren, könntest du es nur alle x Events oder x Sekunden aktualisieren.
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    In diese Richtung hatte ich auch schon gedacht, wie kann ich das jedoch machen?
    Bin leider kein Programmierer sondern habe ab und zu Aufgaben wo ich was programmieren muss.

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

    @martinf So was:

    VB.NET-Quellcode

    1. Private Counter As Integer = 0
    2. Private Sub HttpDownloader_ProgressChanged(ByVal sender As Object, ByVal e As AltoHttp.ProgressChangedEventArgs)
    3. Counter += 1
    4. If Counter \ 10 <> 0 Then ' die "10" musst Du ausprobieren
    5. Return
    6. End If
    7. progressBar.Value = CInt(e.Progress)
    8. lblPercent.Text = $"{e.Progress.ToString("0.00")} % "
    9. lblSpeed.Text = String.Format("{0} MB/s", (e.SpeedInBytes / 1024.0R / 1024.0R).ToString("0.00"))
    10. lblDownloaded.Text = String.Format("{0} MB", (httpDownloader.TotalBytesReceived / 1024.0R / 1024.0R).ToString("0.00"))
    11. lblStatus.Text = "Downloading..."
    12. End Sub
    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!

    martinf schrieb:

    Bin leider kein Programmierer sondern habe ab und zu Aufgaben wo ich was programmieren muss.
    Was für mich ein Widerspruch in sich ist, denn ich bin der Meinung:

    VaporiZed schrieb:

    Sobald Du Code schreibst, bist Du einer. Vielleicht nicht beruflich oder professionell. Aber das sind hier im Forum eh nur die wenigsten, wage ich zu behaupten.


    zum Thema: Mit Date.Now bekommst Du die aktuelle Zeit zum Zeitpunkt jenes Aufrufs.
    Du kannst also schreiben:

    VB.NET-Quellcode

    1. Private Timestamp As Date
    2. Private Sub HttpDownloader_ProgressChanged(ByVal sender As Object, ByVal e As AltoHttp.ProgressChangedEventArgs)
    3. If (Date.Now - Timestamp).TotalSeconds < 5 Then Return 'bedeutet: nur alle 5 Sekunden die Methode hier NICHT abbrechen (Return), sondern restlichen Code abarbeiten
    4. Timestamp = Date.Now 'Timestamp neu setzen, damit der 5-Sekunden-"Zyklus" wieder neu startet
    5. 'und hier kommt Dein bisheriger Code der Methode hin
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.