Multi-Download nur im Doppelpack

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Multi-Download nur im Doppelpack

    Moin Leute,
    ich habe einen Multi-Downloader gebaut, der pro Instanz immer einen File downloaden soll:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Data
    3. Imports System.Threading
    4. Public Class MyDownload
    5. Public Event DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    6. Public Event DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
    7. Private WithEvents _Downloader As WebClient
    8. Private _Thread As Thread ' Download-Thread
    9. Public ReadOnly _Index As Integer ' Index für Multi-Download
    10. Private _FileName As String ' Save As ...
    11. Private _Uri As Uri ' Source
    12. Public Sub New(index As Integer)
    13. _Downloader = New WebClient
    14. _Index = index
    15. _Thread = Nothing
    16. End Sub
    17. Public Sub DownloadFileAsync(ByVal url As Uri, ByVal FileName As String)
    18. _FileName = FileName
    19. _Uri = url
    20. ' jedes Mal ein neuer Thread
    21. If _Thread Is Nothing OrElse Not _Thread.IsAlive Then
    22. _Thread = New Thread(AddressOf StartThread)
    23. End If
    24. _Thread.Start()
    25. End Sub
    26. Private Sub StartThread()
    27. _Downloader.DownloadFileAsync(Me._Uri, Me._FileName)
    28. End Sub
    29. Public Sub CancelAsync()
    30. _Downloader.CancelAsync()
    31. End Sub
    32. Private Sub downloader_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles _Downloader.DownloadProgressChanged
    33. RaiseEvent DownloadProgressChanged(Me, e)
    34. End Sub
    35. Private Sub downloader_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles _Downloader.DownloadFileCompleted
    36. Dim fi As New System.IO.FileInfo(_FileName)
    37. If (fi.Length = 0) Then
    38. fi.Delete()
    39. End If
    40. RaiseEvent DownloadFileCompleted(Me, e)
    41. End Sub
    42. End Class

    Nun betreibe ich diese Klasse parallel in 8 Instanzen.
    Leider downloaden immer nur gleichzeitig 2 Instanzen, wenn die fertig sind, starten die nächsten beiden Instanzen usw.
    Wie kann ich das Download richtig parallelisieren?
    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!
    So weit ich weiß verarbeiten Async-Methoden dateien nacheinander, nicht gleichzeitig.
    So wie in einer Warteschleife.

    Ich programmiere nicht mehr so viel VB, aber möglicherweise gibt es ja eine DownloadFile-Methode ohne das Async.
    Die kannst du in einem neuen Thread laufen lassen und die Datei so downloaden.

    Falls das auch nur parallel geht, unterstützt DownloadFile halt nicht mehr.
    Dann musste auf andere Mittel zurückgreifen.
    /sign - der code sieht mir auch ok aus.

    Nur ist Unfug, einen Thread zu erstellen, und dann im Thread nochmal .DownLoadFileAsync() aufzurufen.
    Weil nebener als im Nebenthread wirds davon auch nicht ;)

    Auch problematisch, dass dein Downloader das Event im NebenThread feuert. Das ist ja genau, warums WebClient.DownloadFileAsync gibt: dasses Event wieder im HauptThread kommt.

    ErfinderDesRades schrieb:

    dasses Event wieder im HauptThread kommt.
    Das ist nicht das Problem.
    Wenn ich im FF die Seite öffne und die Dateien einzeln downloade, kommen (beliebig) viele Parallel-Loads zustande, hier nur zwei.
    Ich dachte erst, die Seite sei ausgebremst, das isses aber nicht.
    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!

    hal2000 schrieb:

    Was sagt denn Wireshark
    Is ja ein niedliches Instrument :thumbup:

    Mir scheint, dass zwei Anforderungen sofort, die nächsten leicht verzögert rausgehen.
    Die Files werden sofort angelegt.
    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!

    hal2000 schrieb:

    Das hier könnte die Lösung sein:
    Das war die Lösung. :thumbup:
    Danke.
    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!