während Download warten bis abgeschlossen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    während Download warten bis abgeschlossen

    Hey Leute ^^

    Ich schon wieder :P
    Ich habe diesen Code:

    Spoiler anzeigen

    Quellcode

    1. Public WithEvents client As New Net.WebClient
    2. Public Sub DownloadFiles()
    3. If File1 = 1 Then
    4. If My.Computer.FileSystem.FileExists(File) Then
    5. My.Computer.FileSystem.DeleteFile(File)
    6. lbProgramm.Text = "File_Setup_" + Version+ ".exe"
    7. client.DownloadFileAsync(New Uri("https://www.FILE.de"), "File_Setup_" + Version+ ".exe")
    8. Else
    9. lbProgramm.Text = "File_Setup_" + Version+ ".exe"
    10. client.DownloadFileAsync(New Uri("https://www.FILE.de"), "File_Setup_" + Version+ ".exe")
    11. End If
    12. End If
    13. If File2 = 1 Then
    14. If My.Computer.FileSystem.FileExists(File2) Then
    15. My.Computer.FileSystem.DeleteFile(File2)
    16. lbProgramm.Text = "File2_Setup_" + Version2+ ".exe"
    17. client.DownloadFileAsync(New Uri("https://www.FILE2.de"), "File2_Setup_" + Version2+ ".exe")
    18. Else
    19. lbProgramm.Text = "File2_Setup_" + Version2+ ".exe"
    20. client.DownloadFileAsync(New Uri("https://www.FILE2.de"), "File2_Setup_" + Version2+ ".exe")
    21. End If
    22. End If
    23. End Sub
    24. Sub Finished(ByVal sender As System.Object, ByVal e As EventArgs) Handles client.DownloadFileCompleted
    25. lbProgramm.Text = ""
    26. pbFortschritt.Value = 0
    27. End Sub
    28. Sub ProgressChanged(ByVal sender As System.Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles client.DownloadProgressChanged
    29. pbFortschritt.Value = e.ProgressPercentage
    30. tbProzent.Text = pbFortschritt.Value
    31. End Sub


    Habe noch eine Progressbar = pbFortschritt / und lable = lbProgramm.

    Das Funtzt Super aber wenn ich oben noch ein Zweiten download nach dem ersten machen will sagt er das nicht mehrere gleichzeitig ausgeführt werden können :( Wie kann ich das Programm an der stelle warten lassen bis das erste Programm geladen hat ?

    EDIT: Oder kann ich beide downloads gleichzeitig downloaden lassen aber trozdem zwei exen haben ?

    MFG
    Peter

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

    nawiat schrieb:

    Hey Leute ^^

    Ich schon wieder :P


    Och nöö, nich du schon wieder :D

    Ernsthaft jetzt. Benutze eine Liste, in der die zu ladenden Files gespeichert werden (eine Queue bietet sich an). Die Files kannst du in einer Listbox anzeigen und dann eins nach dem anderen herunterladen, bis die Queue leer ist.
    So können jederzeit eines oder auch zweihundert Files in die Warteschlange gestellt werden.

    VB.NET-Quellcode

    1. Dim WithEvents wClient As WebClient
    2. Public Sub New()
    3. wClient = new WebClient()
    4. InitComponents() 'Oder wie auch immer die Methode ist...
    5. End Sub
    6. Public Sub button1_onClick(sender As Object, evt as EventArgs) Handles button1.Click
    7. downloadFile(<Link>, <Pfad>, <Datei überschreiben?>)
    8. End Sub
    9. Private Sub downloadFile(dlLink as String, dlPath As String, overwrite As Boolean)
    10. wClient.DownloadProgressChanged +=
    11. Function(s, e)
    12. label1.Text = String.Format("{0}{1}", e.ProgressPercentage.ToString, "%")
    13. progressBar1.Value = e.ProgressPercentage
    14. if button1.Enabled Then button1.Enabled = False
    15. End Function
    16. wClient.DownloadFileCompleted +=
    17. Function(s, e)
    18. label1.Text = ""
    19. progressBar1.Value = 0
    20. If Not button1.Enabled Then button1.Enabled = True
    21. End Function
    22. End Sub


    Das sollte funktionieren. Sorry, wenn da etwas komisch aussieht, ich programmiere eher in C# oder Java als VB.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

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

    nawiat schrieb:

    mhm wenn ich das einfüge sind mir zu viele fehler


    Fehler sind da keine. Ich habe gerade geguckt. Du solltest ja auch nicht alles kopieren, sondern dir den Code angucken und verstehen wie es funktioniert. Bzw.; du müsstest ja auch die Variablen umschreiben und den Code für deinen Nutzen anpassen.

    nawiat schrieb:

    mit functionen kann ich nicht so gut arbeiten

    o_O
    Benutzt du nur Subs oder was?

    Dass du die Lambas erstmal nicht verstehst, ist mir klar, aber Functions an sich MUSST du benutzen.
    Spoiler anzeigen
    Methoden sind Subs; haben KEINEN Rückgabewert. Funktionen sind Functions (duh), sie haben einen Rückgabewert, außer diese.


    Ich habe den Code so geschrieben, damit es übersichtlich ist. Die Functions sind quasi Methoden, nur halt ohne Namen (Lambda => anonyme Funktion oder Methode).

    nawiat schrieb:

    meinen Code ne While Schleife einzubauen oder sowas ?


    Nope. Schau dir den Code nochmal an. Da steht doch was mit button1.Enabled, oder? Sollte hinweis genug sein :D

    EDIT:
    Bei einer While-Schleife würdest du im Endeffekt nur einen Deadlock erzeugen, oder den Nutzer an der weiteren Nutzer des gesamten Programms hindern - Das wollen wir nicht.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    bei mir wird in dein Sub Download File der Client nicht mehr erkannt..
    hab das aus button 1 in mein Sub gepackt der angesprochen wird und dann verweiße ich auf dein Sub unten. Aber ich kann doch kein Sub Enabled = Fals/True setzen. Das ergibt doch kein sinn XD

    Edit: Client wurde nicht deklariert. Button1 in dein Sub kann ich ja nicht in mein Subnamen umändern, aber warum du ein Button enablen willst weiß ich eh nicht XD ist mir grade zu hoch deine denkweiße :P

    nawiat schrieb:

    bei mir wird in dein Sub Download File der Client nicht mehr erkannt..


    Poste mal deinen gesamten Code (mit Spoiler), ich schau mir das mal an.

    nawiat schrieb:

    Aber ich kann doch kein Sub Enabled = Fals/True setzen. Das ergibt doch kein sinn XD


    Sollst du auch nicht? Wie kommst du denn darauf?
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public WithEvents wClient As WebClient
    2. Public Sub New()
    3. wClient = New WebClient()
    4. InitializeComponent()
    5. End Sub
    6. Public Sub DownloadFiles()
    7. My.Computer.FileSystem.DeleteFile(ExePDFCREATOR)
    8. lbProgramm.Text = "PDFCreator_Setup_" + AktuellePDFCreatorVersionP + ".exe"
    9. downloadFile("https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/22.0/win32/en-US/Firefox Setup 22.0.exe", "D:\Standart Software Checker Programme\MozillaFirefox_Setup_" + AktuelleFirefoxVersionP + ".exe", True)
    10. Else
    11. lbProgramm.Text = "PDFCreator_Setup_" + AktuellePDFCreatorVersionP + ".exe"
    12. downloadFile("https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/22.0/win32/en-US/Firefox Setup 22.0.exe", "D:\Standart Software Checker Programme\MozillaFirefox_Setup_" + AktuelleFirefoxVersionP + ".exe", True)
    13. End If
    14. End If
    15. If DownloadJava = 1 Then
    16. If My.Computer.FileSystem.FileExists(ExeJAVA) Then
    17. My.Computer.FileSystem.DeleteFile(ExeJAVA)
    18. lbProgramm.Text = "Java_Setup_" + AktuelleJavaSEVersionP + ".exe"
    19. downloadFile("https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/22.0/win32/en-US/Firefox Setup 22.0.exe", "D:\Standart Software Checker Programme\MozillaFirefox_Setup_" + AktuelleFirefoxVersionP + ".exe", True)
    20. Else
    21. lbProgramm.Text = "Java_Setup_" + AktuelleJavaSEVersionP + ".exe"
    22. downloadFile("https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/22.0/win32/en-US/Firefox Setup 22.0.exe", "D:\Standart Software Checker Programme\MozillaFirefox_Setup_" + AktuelleFirefoxVersionP + ".exe", True)
    23. End If
    24. End If
    25. End Sub
    26. Private Sub downloadFile(dlLink As String, dlPath As String, overwrite As Boolean)
    27. client.DownloadProgressChanged +=
    28. Function(s, e)
    29. lbProgramm.Text = String.Format("{0}{1}", e.ProgressPercentage.ToString, "%")
    30. progressBar1.Value = e.ProgressPercentage
    31. If button1.Enabled Then button1.Enabled = False
    32. End Function
    33. client.DownloadFileCompleted +=
    34. Function(s, e)
    35. lbProgramm.Text = ""
    36. progressBar1.Value = 0
    37. If Not button1.Enabled Then button1.Enabled = True
    38. End Function
    39. End Sub
    Das ist nicht die ganze Klasse. So macht der Code überhaupt keinen Sinn.

    Zudem, sollte man das My-Namespace nie benutzen. Auch nicht, wenn es nur schnell gehen soll.

    EDIT:
    Schau mal, ob du damit was anfangen kannst.

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports Microsoft.VisualBasic
    4. Imports System.IO
    5. Imports System.Net
    6. Imports System.Threading
    7. Public Class Class1
    8. Dim currentPdfCreatorVersion As String = 0
    9. Dim currentFirefoxVersion As String = 0
    10. Dim pdfCreatorExe As String = "" ' Hier Pfad eingeben...
    11. ' Die restlichen Variablen sind in der Designer-Datei, die brauchst du NICHT nochmal deklarieren.
    12. Private Sub downloadAllFiles()
    13. downloadFileAsync(New Uri("http://pen.de"), String.Format("PDFCreator_Setup_{0}.exe", currentPdfCreatorVersion), File.Exists(pdfCreatorExe), Nothing, Nothing)
    14. ' Vorgang wiederholen
    15. End Sub
    16. Public Shared Sub downloadFileAsync(dlLink As Uri, dlPath As String, overwrite As Boolean, ByRef eventOut As DownloadProgressChangedEventArgs, ByRef isFinished As Boolean)
    17. Dim wClient As WebClient = New WebClient()
    18. wClient.DownloadProgressChanged += Function(s, evt)
    19. eventOut = evt
    20. End Function
    21. wClient.DownloadFileCompleted += Function(s, evt)
    22. isFinished = True
    23. End Function
    24. wClient.DownloadFileAsync(dlLink, dlPath)
    25. End Sub
    26. End Class

    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

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

    bei "wClient.DownloadProgressChanged" in deinen Sub sagt er noch folgendes:

    "Fehler 4 "Public Event DownloadProgressChanged(sender As Object, e As System.Net.DownloadProgressChangedEventArgs)" ist ein Ereignis und kann nicht direkt aufgerufen werden. Verwenden Sie eine RaiseEvent-Anweisung, um ein Ereignis aufzurufen."

    Edit: Sry mein Fehler XD ich schau mal und gebe dir eine rückmeldung ob es geht oder nicht ^^

    Edit2: ne wenn ich das "Option Strict On" setze kommen zu viele fehler in meinen Programm und in deinen Sub kommen auch nochmal 4 hinzu, kann man das umbauen in dein Sub ? fehlermeldung steht oben

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

    Hallo nawiat,

    Das für dich Infrage kommende Stichwort lautet DownloadFileAsync Klick mich

    Um einen Download zu Starten benötigst du als Erstes einen WebClient und den entsprechenden Handler für die Download Fertigstellung:

    VB.NET-Quellcode

    1. Dim MeinWebClient As New Net.WebClient
    2. AddHandler MeinWebClient.DownloadFileCompleted, AddressOf Me.DownloadFileCompleted


    Als nächstes musst du einfach nur noch den Download Starten:

    VB.NET-Quellcode

    1. MeinWebClient.DownloadFileAsync(New Uri("<LINK>"), "<LOKALER DATEIPFAD>")


    Und dann eben sobald der Download Fertiggestellt wurde deine Aktion(en) ausführen:

    VB.NET-Quellcode

    1. Private Sub DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
    2. MsgBox("Download Abgeschlossen!")
    3. End Sub

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

    nawiat schrieb:

    wenn ich das "Option Strict On" setze kommen zu viele fehler in meinen Programm
    hä? wenn ich setze....?
    Strict On ist eine Programmier-Vorraussetzung, und nicht ein Gimmick, was man mal setzt.

    Die Fehler zeigen dir, dass @BeatsleigherXDAs Code vorne und hinten nicht funktioniert - ein Detail hat @petaod schon genannt.
    Die Krux ist: sein Code ist aus c# übertragen, und in vb.net nicht getestet worden.
    okay ich danke euch allen für eure Hilfe aber ich habs jetzt 2 Stunden versucht mein Code umzubauen und es geht wirklich XD einfach mein Code ganz oben umgebastelt. Zwar nicht schön aber es geht :P

    hab alles aus den einen Sub in 9 unterschiedliche Subs gepackt und frage in meinen ersten Sub ab ob ein Integer 1 oder 0 ist wenn dann geh in den Sub von Mozilla, ElseIf geh in den anderen und wenn er iwo rein geht setze ich ihn auf 0 und beim nächsten durchlauf geht er da ja nicht mehr rein und nimmt den nächsten. Dann einfach in meinen Finish Sub wieder auf den obersten Sub verweißen XD Danke euch allen, echt nettes Forum hier ^^

    MFG
    Peter

    nawiat schrieb:

    ...9 unterschiedliche Subs gepackt ... frage ... ob ein Integer 1 oder 0 ist ... setze ich ihn auf 0 und beim nächsten durchlauf geht er da ja nicht mehr rein...


    Das klingt für mich nach einem dahin gewürfeltem Code.

    Du solltest dich mal über ​Strict On Informieren, außerdem solltest du dir das mal durchlesen.