Datei herunterladen mit einem Backgroundworker funktioniert nicht

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

Es gibt 177 Antworten in diesem Thema. Der letzte Beitrag () ist von BradApfel.

    Datei herunterladen mit einem Backgroundworker funktioniert nicht

    Hallo!

    Ich möchte eine Datei herunterladen, und dabei den Prozent-Fortschritt in einem Label ausgeben.
    Nur das Problem ist, das der Backgroundworker nichts macht.
    Und der Copiler gibt mir an der Download-Zeile einen Fehler aus: Das Argument kann nicht 'Nothing' sein. Parametername: destinationFileName.

    Und wie kann ich den Quellcode Posten?

    Ich hoffe ihr könnt mir helfen.

    Jason schrieb:

    Das Argument kann nicht 'Nothing' sein. Parametername: destinationFileName.


    Da hast du doch deine Fehlermeldung. destinationFileName ist Nothing, weshalb du ihn einen Wert zuweisen musst.
    Edit:

    Jason schrieb:

    Können das auch Parameter sein?

    Kommt drauf an was du darunter verstehst.

    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Hier ist mein Quellcode:

    VB.NET-Quellcode

    1. Public Class Form3
    2. Dim WithEvents BackgroundWorker As New System.ComponentModel.BackgroundWorker With {.WorkerReportsProgress = True, .WorkerSupportsCancellation = True}
    3. Dim DownloadAbgeschlossen As Boolean = False
    4. Dim Fortschrittzahl As Integer = 1
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles DownloadAbbrechenLabel.Click
    6. If DownloadAbgeschlossen = True Then
    7. Me.Close()
    8. ElseIf DownloadAbgeschlossen = False Then
    9. BackgroundWorker.CancelAsync()
    10. End If
    11. End Sub
    12. Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. Start()
    14. DownloadAbbrechenLabel.Text = "Abbrechen"
    15. End Sub
    16. Private Sub Start()
    17. DownloadStateLabel.Text = "Bitte warten..."
    18. ProgressBar1.Maximum = CInt(1)
    19. ProgressBar1.Value = 0
    20. BackgroundWorker.RunWorkerAsync(CInt(1))
    21. End Sub
    22. Private Sub BackgroundWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
    23. If Not BackgroundWorker.IsBusy Then
    24. DownloadStateLabel.Text = "Bitte warten..."
    25. ProgressBar1.Maximum = CInt(1)
    26. ProgressBar1.Value = 0
    27. BackgroundWorker.RunWorkerAsync(CInt(1))
    28. End If
    29. Try
    30. My.Computer.Network.DownloadFile("https://www.dropbox.com/s/4papxl64ouzjayc/Computer sprechen lassen.exe?dl=0", Form2.DownloadPathTextBox.Text)
    31. Catch ex As Exception
    32. MessageBox.Show(ex.Message)
    33. End Try
    34. End Sub
    35. Private Sub BackgroundWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker.ProgressChanged
    36. ProgressBar1.Value = e.ProgressPercentage + 1
    37. Fortschrittzahl += 1
    38. ProzentLabel.Text = Fortschrittzahl & " %"
    39. End Sub
    40. Private Sub BackgroundWorker_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker.RunWorkerCompleted
    41. If e.Cancelled Then
    42. DownloadStateLabel.Text = "Vorgang abgebrochen"
    43. DownloadAbgeschlossen = False
    44. ProzentLabel.Visible = False
    45. DownloadStateLabel.Visible = False
    46. DownloadAbbrechenLabel.Text = "Schließen"
    47. Label1.Text = "Der Download wurde unterbrochen."
    48. Label2.Visible = False
    49. Else
    50. DownloadStateLabel.Text = "Vorgang abgeschlossen"
    51. DownloadAbgeschlossen = True
    52. ProgressBar1.Visible = False
    53. ProzentLabel.Text = "100 %"
    54. ProzentLabel.Visible = False
    55. DownloadStateLabel.Visible = False
    56. DownloadAbbrechenLabel.Text = "Schließen"
    57. Label1.Text = "Der Download wurde erfolgreich abgeschlossen."
    58. End If
    59. End Sub
    60. End Class


    Und danke an ErfinderDesRades.

    Jason schrieb:

    VB.NET-Quellcode

    1. My.Computer.Network.DownloadFile("https://www.dropbox.com/s/4papxl64ouzjayc/Computer sprechen lassen.exe?dl=0", Form2.DownloadPathTextBox.Text)


    Instanziierung von Forms und Aufruf von Dialogen

    außerdem

    Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯

    Jason schrieb:

    Leider weiß ich nicht was ein Argument ist.
    Können das auch Parameter sein?
    jepp - ist dasselbe.
    Hier noch mehr so Zeugs: Grundlagen: Fachbegriffe

    Ist wichtig, um ühaupt eine gemeinsame Sprache herzustellen.
    Zum Problem: Aus einem NebenThread darfst du überhaupt nicht auf ein Control zugreifen - jeder Versuch mit DownloadPathTextBox.Text wird failen - egal was du da anstellst.

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

    VB.NET-Quellcode

    1. Private _DownloadTarget As String
    2. Private Sub Start()
    3. _DownloadTarget = DownloadPathTextBox.Text
    4. DownloadStateLabel.Text = "Bitte warten..."
    5. ProgressBar1.Maximum = CInt(1)
    6. ProgressBar1.Value = 0
    7. BackgroundWorker.RunWorkerAsync(CInt(1))
    8. End Sub
    9. Private Sub BackgroundWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
    10. My.Computer.Network.DownloadFile("https://www.dropbox.com/s/4papxl64ouzjayc/Computer sprechen lassen.exe?dl=0", _DownloadTarget)
    11. End Sub
    Probier erstma so, obs läuft - mitte Progressbar wirds vmtl den nächsten Ärger geben.
    Beachte, dass auf die DownloadPathTextBox im HauptThread zugegriffen wird - nicht im NebenThread.

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

    Moin,

    sowas würde ich über Events regeln. Eigene EventArgs-Klasse anlegen, sodass man als Parameter einen String übergeben kann.
    Dann einfach Delegates anlegen für die EventHandler und dann die Handler-Methode setzen und darin den Parameter verarbeiten.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    du meinst nicht im Ernst, dass der TE das verstehen kann, odr?
    Zumals glaub nichtmal richtig ist.

    Quick&Dirty würde ich auch den Konstruktor empfehlen, obwohl auch der bei Forms für Komplikationen sorgt.
    Weil den (verborgenen) Standard-Konstruktor darf man ja nicht ersetzen, sondern man muss eine Konstruktor-Überladung dran-proggen.
    Da wird einfacher sein, ein Property oder mindestens ein Public Feld an Form3 dranzumachen, etwa das von mir drangebastelte _DownloadTarget Public setzen, und schon kann Form2 da das DownloadTarget reinschreiben, bevor es Form3 öffnet.

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

    Ich habe ja nur eine Lösung genannt, wie man sowas macht. Das geht über Events, so kann man ja zwischen Forms kommunizieren.

    Im Falle, dass der TE dies nicht versteht, kann ich da auch nichts machen, dann ist das ein Mangel an Grundlagen, der behoben werden muss.
    Zumal es ja auch nicht nur den TE interessieren könnte, sondern auch andere Leute, die darauf stoßen und etwas damit anfangen können.

    Schreibe ich jetzt einen Code, dann wäre das Verständnis wahrs. genauso wenig da.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Danke für eure Antworten.

    Ich melde mich nachher nochmal wieder, ich versuche den Fehler zu beheben.

    Wie gebau funktioniert das:

    @Trade
    sowas würde ich über Events regeln. Eigene EventArgs-Klasse anlegen, sodass man als Parameter einen String übergeben kann.

    Dann einfach Delegates anlegen für die EventHandler und dann die Handler-Methode setzen und darin den Parameter verarbeiten.

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

    Wie beschrieben.
    Ich glaube hier wurde das auch erklärt:

    Instanziierung von Forms und Aufruf von Dialogen - WinForms - VB ...
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    wie gesagt: Events sind hier nicht der richtige Ansatz.
    Form2 ist Owner von Form3, und kann daher direkt Form3 manipulieren.
    Nur wenn Form3 Form2 manipulieren wollte, wären Events vonnöten.

    VB.NET-Quellcode

    1. Public _DownloadTarget As String 'dieses muss nu in Form2 gesetzt werden, dann sollte es laufen
    2. Private Sub Start()
    3. '_DownloadTarget = DownloadPathTextBox.Text
    4. DownloadStateLabel.Text = "Bitte warten..."
    5. ProgressBar1.Maximum = CInt(1)
    6. ProgressBar1.Value = 0
    7. BackgroundWorker.RunWorkerAsync(CInt(1))
    8. End Sub
    9. Private Sub BackgroundWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
    10. My.Computer.Network.DownloadFile("https://www.dropbox.com/s/4papxl64ouzjayc/Computer sprechen lassen.exe?dl=0", _DownloadTarget)
    11. End Sub