DownloadFileAsync mit DownloadFileCompleted

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Fire88.

    DownloadFileAsync mit DownloadFileCompleted

    Hallo com,
    ich mache gerade ein Download Programm welches ich mit DownloadFileAsync machen möchte.

    nun habe ich aber eine Frage, und zwar wie muss ich es machen das ich den aktuellen DL Fortschrit anzeigen lassen kann?

    ich habe dies mal so gemacht:

    VB.NET-Quellcode

    1. Private Sub downloader_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) Handles downloader.DownloadProgressChanged
    2. Invoke(Sub()
    3. ProgressBar2.Maximum = 100
    4. ProgressBar2.Value = e.ProgressPercentage
    5. End Sub)
    6. End Sub


    Diesen habe ich bereits benutzt bei einem Normalen also nicht ansynchronen Download und hat supper Funktioniert.
    zusätzlich möchte ich noch den sub einfügen wen die datei fertig heruntergeladen wurde.

    VB.NET-Quellcode

    1. Private Sub downloader_DownloadFileCompleted(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) Handles downloader.DownloadFileCompleted
    2. End Sub


    Ich habe nun aber auf MSDN das Beispiel gesehen mit den AddHandler und diese ferstehe ich nicht ganz. MUSS ich diese so schreiben und einsetzen oder geht dies auch von alleine?

    Hier noch ein ausschnit von MSDN:

    VB.NET-Quellcode

    1. ' Sample call : DownLoadFileInBackground2 ("http:' www.contoso.com/logs/January.txt")
    2. Public Shared Sub DownLoadFileInBackground2(ByVal address As String)
    3. Dim client As WebClient = New WebClient()
    4. ' Specify that the DownloadFileCallback method gets called
    5. ' when the download completes.
    6. AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCallback2
    7. ' Specify a progress notification handler.
    8. AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressCallback
    9. Dim uri as Uri = New Uri(address)
    10. client.DownloadFileAsync(uri, "serverdata.txt")
    11. End Sub
    mir scheint, dir fehlt ein Verständnis sowohl des AddHandler-Schlüsselwortes als auch des AddressOf - Operators.

    Sollteste dich mal informieren, mw. über google auf msdn, oder auch dieses Buch Lesen.

    Ansonsten bleibt dein Prog so oder so planlos, denn selbst wenndes zum Laufen bringst, weißt du nicht, was da vor sich geht.
    Erstelle dazu am besten im Designer einen Webclient.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. WebClient1.DownloadFileAsync(New Uri("deine url und dateiname"), "lokaler speicherort mit dateiname")
    3. End Sub
    4. Private Sub WebClient1_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WebClient1.DownloadProgressChanged
    5. ProgressBar1.Value = e.ProgressPercentage
    6. End Sub
    7. Private Sub WebClient1_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles WebClient1.DownloadFileCompleted
    8. 'deine Aktionen
    9. End Sub
    Du kannst einen Weblient über die Toolbox hinzufügen, falls du keinen
    Webclient in der Toolbox findest, dann mach Rechtsklick(Maus)
    auf der toolbox und wähle die Option "Elemente auswählen".
    Dann die Registerkarte .net Framework Komponenten und einen
    haken bei webclient machen OK klicken und fertig.
    Bilder
    • Screen.png

      27,23 kB, 584×433, 310 mal angesehen

    Derfuhr schrieb:

    Erstelle dazu am besten im Designer einen Webclient.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. WebClient1.DownloadFileAsync(New Uri("deine url und dateiname"), "lokaler speicherort mit dateiname")
    3. End Sub
    4. Private Sub WebClient1_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WebClient1.DownloadProgressChanged
    5. ProgressBar1.Value = e.ProgressPercentage
    6. End Sub
    7. Private Sub WebClient1_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles WebClient1.DownloadFileCompleted
    8. 'deine Aktionen
    9. End Sub

    backtothetoast schrieb:

    Mal eine Frage zum WebClient. Es scheint, dass dieser WebClient ein Control ist.. da wollte ich fragen, wie ich diesen zu meiner Form hinzufüge.

    mfg.
    Und doppelt Falsch.
    a) Nen WebClient hat nix und auch wirklich ABSOLUT rein GAR NIX in nem GUI-Editor verloren. Ihr könnt nicht alles was nen Event hat in nen GUI-Editor schmeißen. Das ist schonmal der größte Quatsch den ich je gehört habe. Das ist von VB.NET allgemein so ne Art Krankheit, dass keiner Grundlagen kann aber jeder irgendwas sich mit Drag and Drop in nem Designer zusammenkleistert und dabei noch nichtmal wirklich weiß was er überhaupt macht. :(
    b) Was das mit dem AddHandler angeht. Das ist so: Die Klasse WebClient hat von mir aus das Event ProgressChanged. Dieses ProgressChanged Event kannst du dir vorstellen wie eine Sammlung von Subs welche aufgerufen werden wenn das Event eintritt. Jedoch musst DU natürlich dieser Sammlung eine solche Sub hinzufügen. Und genau das machst du mit AddHandler.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    schreib einfacht



    Dim wc As WebClient = New WebClient()
    Das wäre falsch, den wenn man AddHandles verwenden möchte,
    braucht man das "WithEvents" so wäre es dann, so denke ich mal korrekt.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Net
    3. Public Class frmMain
    4. Dim WithEvents WC As WebClient = New WebClient()
    5. Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. AddHandler WC.DownloadProgressChanged, AddressOf WC_DownloadProgressChanged
    7. AddHandler WC.DownloadFileCompleted, AddressOf WC_DownloadFileCompleted
    8. End Sub
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. WC.DownloadFileAsync(New Uri("deine url und dateiname"), "lokaler speicherort mit dateiname")
    11. End Sub
    12. Private Sub WC_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WC.DownloadProgressChanged
    13. ProgressBar1.Value = e.ProgressPercentage
    14. End Sub
    15. Private Sub WC_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles WC.DownloadFileCompleted
    16. 'deine Aktionen
    17. End Sub
    18. End Class
    Immer wenn ich AddHandler ohne das WithEvents nutze
    kommt es bei mir zu Fehlern.

    VB.NET-Quellcode

    1. Handles WC.DownloadProgressChanged

    unter WC habe ich dann die geliebte blaue Schlangenlinie.

    edit: Diese Fehlermeldung kommt dann:

    Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird.

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

    Derfuhr schrieb:

    Immer wenn ich AddHandler ohne das WithEvents nutze
    kommt es bei mir zu Fehlern.

    Aber was du zeigst, nutzt doch garkein AddHandler - also wassis das Problem?

    Fehlermeldung: Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird.
    Ja, und? Dann gibts bei dir wohl keine WithEvents-Variable namens wc, oder wie sonst kann man diese Fehlermeldung verstehen?



    @SpaceyX
    Ich finds garnet schlecht, einen WebClient aufs Form zu schmeißen. Es ist zwar kein Control, aber dennoch ist vorgesehen, dass das Ding aufs Form geschmissen wird, denn es ist eine Component.
    Und ebenso wie etwa den Windows.Timer kann man das Dings aufs Form schmeißen, und kann man sogar im Property-Fenster eine url einstellen, wenn es beliebt, und v.a. einen Doppelclick drauf machen, dass man die Handler-Methode generiert bekommt.
    Codemäßig ist das sogar sauberer, denn kaum einer weiß oder kümmert sich darum, dass WebClient IDisposable ist, und also aufgeräumt gehört.
    Ist er aber per Designer aufs Form geschmissen, so kümmert sich auch das Form um die Resourcenbereinigung.

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

    ErfinderDesRades schrieb:

    Aber was du zeigst, nutzt doch garkein AddHandler - also wassis das Problem?

    Echt nicht? In Post#10 in Form_Load steht das doch.
    Habe ich da irgendwie was verkehrt gemacht?

    edit:
    Also der Code Funktioniert ohne einen im Designer erstellten WebClient.

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