Verständnisfrage zu Threading

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Verständnisfrage zu Threading

    Hallo an das Forum,

    habe mich mal mit dem Thema Threading auseinander gesetzt und habe da ein Verständnisproblem:

    Flgender Code:

    VB.NET-Quellcode

    1. Public Class threading
    2. Dim thread_ As System.Threading.Thread
    3. Dim durchlauf As Boolean = False
    4. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    5. thread_ = New System.Threading.Thread(AddressOf test)
    6. thread_.Start()
    7. MsgBox(durchlauf)
    8. End Sub
    9. Function test()
    10. durchlauf = True
    11. Return durchlauf
    12. thread_.Abort()
    13. End Function
    14. End Class



    Wenn nun der Button gedrückt wird erhalte ich die Meldung False, drücke ich dann nochmals den Button bekomme ich TRUE. Verstehe das nicht so richtig. :S
    Wie könnte ich es anstellen das wenn die Function durchgelaufen ist den Wert TRUE erhalte bein ersten betätigen des Buttons?

    Habunus
    1. Benutz Messagebox.Show() anstatt MsgBox()
    2. Nach Return wird die Funktion verlassen
    3. du musst den thread nicht am ende mit abort() beenden, er beendet nach ablauf von alleine
    4. Dein Code Snippet funktioniert nicht, weil test() asynchron durchgelaufen wird und deshalb sofort nach dem starten die MsgBox kommt (deswegen steht da erstmal false, weil durchlauf noch nicht auf true gesetzt worden ist. beim zweiten mal ist es dann schon true)
    Damits klappt musst du test() im selben thread aufrufen (synchron).
    ganz normal aufrufen ohne threading halt.

    VB.NET-Quellcode

    1. Private durchlauf As Boolean = False
    2. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. test()
    4. MessageBox.Show(durchlauf)
    5. End Sub
    6. 'Den Sinn der Funktion stell ich mal in frage
    7. Function test()
    8. durchlauf = True
    9. Return durchlauf
    10. End Function
    BackgroundWorker sind imo veraltet. Wenn, dann würde ich jene wirklich nur für Fortschritte verwenden. Ansonsten gibt es Tasks und ThreadPools und in 4.5 auch async/await.
    #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 :!:
    Grundsätzlich wird bei solchen Dingen auf das Prinzip von Events und Callbacks zurück gegriffen. Da ab .NET 4.5 hier ein recht nettes Feature dazu kommt, wäre es gut zu wissen welche .NET Version du verwendest.
    PS: Auch das Abschließen eines Vorganges in einem anderen Thread wartet man mit z.B. einem WaitHandle. Problem ist jedoch hierbei, dass dir dadurch weiterhin der GUI Thread einfriert. Deshalb helfen da nur Events, Callbacks,...


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.