Threads sicher vor Programmende stoppen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Chrisber.

    Threads sicher vor Programmende stoppen

    Hallo.
    Aktuell entwickle ich ein eigenes Steuerelement welches mit Threads arbeitet um einige Verzögerungen zu realisieren. Das ganze funktioniert so lange gut, bis der Benutzer die Form schließt und noch ein Thread aussteht. Sozusagen greift der Thread, der dann noch läuft, noch auf ein Element zu, welches nicht mehr existiert -> crash.

    Gibt es eine Möglichkeit, Threads sauber zu beenden?

    Gruß
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    Hi,

    Eins vorweg: Threads sollten nicht extern per Abort() beendet werden, da sie dann keine Möglichkeit mehr haben, ihre Daten zu speichern, was evtl. zu Datenverlust, aber in jedem Fall zu einer Exception führt. Threads werden sauber beendet, indem sie einfach auslaufen, d.h. indem ihre Sub ordnungsgemäß beendet wird. Dazu muss der Mainthread auf die Arbeitssthreads warten, wenn letztere noch aktiv sind. Das kannst du entweder manuell mit einem der ResetEvents (Manual- / Auto- ) oder per Thread.Join() veranlassen. Beispiel:

    VB.NET-Quellcode

    1. Dim meinThread As New Thread(AddressOf ThreadProc)
    2. Dim stopRequested As Boolean = False
    3. Dim alt As New ManualResetEvent(False) 'Alternative
    4. Private Sub ThreadProc()
    5. While Not stopRequested
    6. Thread.Sleep(100)
    7. End While
    8. 'Alternative: alt.Set() 'signalisieren
    9. End Sub
    10. Private Sub Form_Closing(...) Handles ...
    11. stopRequested = True
    12. meinThread.Join() 'lässt den Mainthread warten, bis meinThread ThreadProc beendet hat.
    13. 'Alternative zu .Join(): alt.WaitOne() 'warten, bis meinThread signalisiert
    14. End Sub


    Eventuell möchtest du noch ein Timeout einbauen, falls meinThread nicht schnell genug zurückkehrt. Diesen Wert trägst du in WaitOne() in Millisekunden ein. Danach fährt der Mainthread fort, ohne auf den meinThread zu achten.
    Gruß
    hal2000
    Ich weiss nicht wie Sauber es ist.
    Aber du kannst einen Thread als Backgroundthread einsetzen durch:

    VB.NET-Quellcode

    1. Dim t As New Threading.Thread(AddressOf RunThread)
    2. t.IsBackground = True
    3. t.Start()


    Dadurch wird der Thread , sobald der Mainthread "gekillt" wird, auch gekillt.

    Das einzige Problem ist. Wenn der Thread noch Dinge tun soll. Wie Hal erwähnte Daten speichern oder whatever, wird dies nicht geschehen.

    Wenn der thread nur für Hintergrundaufgaben gedacht ist. Dann ist das denke ich die einfachste Methode.

    gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Hi.
    Danke, beide Methoden sind wohl hilfreich, wobei ich in diesem Fall die Backgroundmethode verwenden werde, da es mir eher auf schnelles beenden ankommt. Wichtige Daten müssen nicht gespeichert werden, es geht nur um grafische Effekte.

    Gruß
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.