BackgroundWorker starten & beenden, während Form offen ist

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von singu.

    BackgroundWorker starten & beenden, während Form offen ist

    Ich steh momentan vor folgendem Problem und zwar möchte ich den BackgroundWorker starten, wenn die Main-Form aufgeht und beenden wenn die Main-Form zugeht. Im DoWork ist eine While-Schleife, die auf Webantwort wartet. Nun hängt sich aber das Programm beim Beenden.
    Hier mal der Code

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Net
    3. Public Class Form1
    4. Private WithEvents bw As New BackgroundWorker()
    5. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    6. Me.bw.RunWorkerAsync()
    7. End Sub
    8. Private Sub bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
    9. Dim Flag As Boolean = True
    10. Dim wc As New WebClient()
    11. Dim text As String = Nothing
    12. While Flag
    13. Try
    14. text = wc.UploadString("http://www.domain.de/test.php", "")
    15. Catch ex As Exception
    16. End Try
    17. If (String.IsNullOrEmpty(text) = False) Then
    18. Flag = False
    19. MessageBox.Show(text)
    20. End If
    21. If (Me.bw.CancellationPending = True) Then
    22. Exit Sub
    23. End If
    24. End While
    25. End Sub
    26. Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    27. Me.bw.CancelAsync()
    28. End Sub
    29. End Class
    CancelAsync sollte im Closing und nicht im Closed stehen.
    Hilft aber vermutlich auch nix, weil UploadString blockt. Besser UploadStringAsync nehmen

    Nachtrach: Und wenn der BGW gecancelt wird, auch gleich den WC mit CancelAsync rausschmeissen.
    Ich hab es jetzt mal mit UploadStringAsync versucht, aber da kommt die Fehlermeldung "Der Ausdruck ergibt kein Wert".

    VB.NET-Quellcode

    1. Private Sub bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
    2. Dim Flag As Boolean = True
    3. Dim wc As WebClient = Nothing
    4. Dim text As String = Nothing
    5. Dim url As Uri = Nothing
    6. wc = New WebClient()
    7. url = New Uri("http://www.domain.de/test.php")
    8. While Flag
    9. Try
    10. text = wc.UploadStringAsync(url, "")
    11. Catch ex As Exception
    12. End Try
    13. If (String.IsNullOrEmpty(text) = False) Then
    14. Flag = False
    15. MessageBox.Show(text)
    16. End If
    17. If (Me.bw.CancellationPending = True) Then
    18. Exit Sub
    19. End If
    20. End While
    21. End Sub
    Wieso kann ich da UploadString nicht nehmen, weil der WebClient gibt lediglich einen Wert zurück ob eine Lösung vorhanden ist oder nicht, also 1 oder 0. Und wenn eine Lösung gefunden wurde, dann wird ein Event gefeuert.

    Edit: Ich hab vergessen die Eigenschaft "WorkerSupportsCancellation" vom BackgroundWorker auf True zu setzen.

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