Ist Thread abbrechen möglich?

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

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

    Ist Thread abbrechen möglich?

    Hallo zusammen,

    bisher hatte ich viel mit BackGroundWorkern gearbeitet. Nun versuche ich mit Threads zu arbeiten und hierzu habe ich eine Frage :

    Ist es mögich einen Thread abzubrechen? Ich habe irgendwo schon einmal gehört, dass es mit Abort funktionieren soll, aber das funktioniert in meinem Fall nicht.
    Ich würde gerne über den "abbrechen-Button" den Thread abbrechen (z.Bsp. weil genug Daten in die ListBox geladen wurden)

    VB.NET-Quellcode

    1. Private Sub Start_Button_Click(sender As Object, e As EventArgs) Handles Start_Button.Click
    2. Start_Button.Enabled = False
    3. ausfuehren()
    4. End Sub
    5. Private Sub Abbrechen_Button_Click(sender As Object, e As EventArgs) Handles Abbrechen_Button.Click
    6. THRD.Cancel '<-- Thread "ausführen" abbrechen!
    7. Start_Button.Enabled = True
    8. End Sub
    9. Sub ausfuehren()
    10. Dim THRD As New Thread(Sub()
    11. '
    12. 'Code der im Hintergrund ausgeführt wird (diverse Abfragen mit befüllen einer ListBox)
    13. '
    14. Start_Button.Enabled = True
    15. End Sub)
    16. THRD.IsBackground = True
    17. THRD.Start()
    18. End Sub
    @zauber777 Kein Problem.
    Die ordentliche Variante:
    Der Thread beendet sich selbst.
    Bu machst Dir eine Boolean Variable, die Du mit nem Button oder sonst wie setzen kannst.
    Diese Variable testest Du in der Thread-Prozedur und beendest dann den Thread.
    Die Holzhammer-Variante:
    Du erstellst Dir die Thread-Variable THRD in der Klasse und kannst dann bei Bedarf mit .Abort() den Thread gewaltsam beenden.
    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!
    Irgendwie komme ich nicht klar mit dem Token-Cancelation.
    Das Problem ist, dass der Thread nicht abgebrochen wird...

    Könnt ihr mir bitte weiterhelfen?

    VB.NET-Quellcode

    1. Dim thread As Threading.Thread = Nothing
    2. Dim threadCancel As Boolean = False
    3. Dim token As New CancellationTokenSource()
    4. Private Sub Start_Button_Click(sender As Object, e As EventArgs) Handles Start_Button.Click
    5. Try
    6. thread = New Threading.Thread(AddressOf ausfuehren)
    7. thread.Start()
    8. Catch ex As Exception
    9. MsgBox(ex.Message)
    10. End Try
    11. End Sub
    12. Private Sub ausfuehren(ByVal obj As Object)
    13. Try
    14. Dim token As CancellationToken = CType(obj, CancellationToken)
    15. While True
    16. Dim IPBereich As String = "192.168.1."
    17. Dim letzterIPBereich As Integer
    18. For letzterIPBereich = 0 To 255
    19. Dim TestIP As String = IPBereich & CStr(letzterIPBereich)
    20. If My.Computer.Network.Ping(TestIP, 10) Then
    21. ListBox1.Items.Add(TestIP)
    22. End If
    23. Next
    24. If token.IsCancellationRequested Then
    25. Exit Sub
    26. Else
    27. End If
    28. End While
    29. Catch ex As Exception
    30. MsgBox(ex.Message)
    31. End Try
    32. End Sub
    33. Private Sub Abbrechen_Button_Click(sender As Object, e As EventArgs) Handles Abbrechen_Button.Click
    34. Try
    35. token.Cancel()
    36. token = New CancellationTokenSource()
    37. thread.SetApartmentState(ApartmentState.STA)
    38. thread.Start(token.Token)
    39. Catch ex As Exception
    40. MsgBox(ex.Message)
    41. End Try
    42. End Sub

    zauber777 schrieb:

    Irgendwie komme ich nicht klar mit dem Token-Cancelation.
    Ich habe Dir andere Möglichkeiten aufgezeigt.
    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!