Thread beenden und starten - Probleme

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Thread beenden und starten - Probleme

    Hallo.

    Ich hätte mal eine Frage wie ich einen Thread so gestalten kann,
    dass ich ihn beenden kann ohne das irgendwelche Fehler entstehen.

    Ich hab schon einiges ausprobiert und die Boardsuche genutzt,

    auf If Thread Is Nothing AndAlso Not Thread.IsAlive geprüft doch selbst da kamen Nullreferenceexceptions.

    Kennt jemand eine saubere Methode um Threads vernünftig zu starten und beenden?
    Das was du machst ist ein komplett falscher Ansatz.
    Du machst in deinem Delegat eine Abbruchbedingung. Wenn diese zutrifft beendet sich der Thread von selbst in dem er z.B. eine Schleife verlässt.
    Damit du das auch sync hinbekommst und du auch weißt, dass er nun beendet ist machst du noch Join.
    In der Praxis heißt das:

    Quellcode

    1. _exitThread = True
    2. thread.Join() 'alternativ kannst du auch ein Timeout verwenden.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Wie sieht das mit asynchronen Actions aus?

    Hab jetzt mal folgendes probiert:

    VB.NET-Quellcode

    1. Private Sub LoadBlacks()
    2. Dim D As Action = Sub()
    3. BlackList.Columns(0).Text = "BlackNicks"
    4. BlackList.Items.Clear()
    5. For Each sf As String In SelfdefinedBlackNicks
    6. BlackList.Items.Add(New ListViewItem With {.Text = sf})
    7. Next
    8. For Each p As String In J.Funcs.LoadBlacks
    9. BlackList.Items.Add(New ListViewItem With {.Text = p})
    10. Next
    11. If BlackList.Items.Count > 0 Then BlackList.Items(0).Selected = True
    12. BlackList.Columns(0).Text = String.Concat("BlackListNicks (", BlackList.Items.Count, ")")
    13. If BlackList.Items.Count > 0 Then
    14. State(BlackList.Items.Count & " Successfully loaded.", Color.Red)
    15. Else
    16. State("No BlackListNicks loaded..", Color.Red)
    17. End If
    18. End Sub
    19. D.BeginInvoke(AddressOf D.EndInvoke, Nothing)
    20. End Sub


    Was würde mir ein Thread da für vorteile bieten bzw. wann nutze ich einen Thread und wann sowas?

    Mit dieser Methode erspart man sich ja auch das Invoken oder?
    Was heißt erspart man sich Invoken? a) machst dort nix anderes als ein Invoke und b) ist das BeginInvoke nicht wirklich async. Es steht dort aber hatte kürzlich das mal in WPF ausprobiert und ich nehme an in WinForms ist es nicht anders. Habe aus einem anderen Thread BeginInvoke aufgerufen, war aber nicht async. Außerdem wenn du Invoke mit einem neuen Thread ersetzt, erzielst du so oder so genau das Gegenteil zu einem Invoke.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    theFiloe irrt, wenner meint, mit .BeginInvoke sei das nicht async.

    VB.NET-Quellcode

    1. D.BeginInvoke(AddressOf D.EndInvoke, Nothing)
    ist eine saubere Verlagerung des D - Aufrufes in einen aus dem Threadpool genommenen NebenThread.

    Den weiteren Code habich nicht verfolgt, Bitte VB-Tag benutzen - aber richtig
    Hi
    die meisten Control-Operationen erfordern allerdings bei Aufrufen aus dem anderen Thread Callbacks, um die Abfolge der Message-Queue nicht durcheinander zu bringen. Beim Invoken sollte der Callback einfach in die Queue eingereiht werden. BeginInvoke auf Forms sollte asynchron, aber im Thread der Form laufen (also asynchron zum aufrufenden Thread), da nicht auf die Beendigung des Aufrufs gewartet wird. Da allerdings auf dem Delegat BeginInvoke ausgeführt wird, sollte das, sofern der Check aktiviert wurde, zu einem Fehler führen oder habe ich da was übersehen? (die Listenveränderungen sollten doch eigentlich ebenfalls im GUI-Thread ablaufen oder?)

    Gruß
    ~blaze~
    Lade halt erst die Daten asynchron und zum füge sie erst zum Schluss alle auf einmal in die Liste ein oder so (am besten per AddRange oder BeginUpdate + EndUpdate oder wie die heißen). Wobei das dann auch nicht unbedingt auf einen Thread zurückgreifen muss. Wenn das zu lange dauert puffere halt einfach immer solange, bis ein bestimmter Zeitrahmen überschritten wurde und update danach die darstellende Liste per Invoke. Es macht auf jeden Fall keinen Sinn, ständig per Invoke die Informationen zu updaten. Das braucht dann länger und blockiert oftmals auch die Benutzerinteraktionen.

    Gruß
    ~blaze~

    Kevin Hombre schrieb:

    vernünftig zu ... beenden?
    Ein Thread sollte sich immer selbst beenden, wenn er seine Arbeit getan hat.
    Dazu muss das Programm lediglich die Thread-Start-Prozedur verlassen.
    Einen Thread mit dem Abort-Holzhammer zu beenden sollte außergewöhnlichen Situationen vorbehalten sein, z.B. einem ungewollten Programmabbruch.
    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!
    Jo, nur selbst dann sollte man ggf. noch mal überprüfen, dass das Programm alles in einem gesicherten Zustand hinterlässt. Es ist eher unpraktisch, wenn das Programm fliegt und einfach mal grad paar Dateien halb fertig sind o.Ä., obwohl dieser Teil ziemlich sicher noch funktioniert hätte. Kommt halt auf den Verwendungszweck an.

    Gruß
    ~blaze~