Thread.Abort() läßt Anwendung abstürzen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von MrTweek.

    Thread.Abort() läßt Anwendung abstürzen

    Hallo mal wieder :)

    ich habe diesmal das Problem, dass ein erzeugter Thread, in dem einfach ein Port lauscht, ob TCP-Verbindungen aufgebaut werden, beim Beenden die ganze Anwendung einfrieren läßt. Der Aufruf passiert so:

    Quellcode

    1. ...
    2. LThread = New System.Threading.Thread(AddressOf ListenThread)
    3. LThread.Start()
    4. ...
    5. Public Sub ListenThread()
    6. While True
    7. Client = Listener.AcceptTcpClient
    8. Dim NewCon As New Connection
    9. NewCon.NetworkStream = Client.GetStream
    10. NewCon.NetworkStreamReader = New StreamReader(NewCon.NetworkStream)
    11. NewCon.NetworkStreamWriter = New StreamWriter(NewCon.NetworkStream)
    12. NewCon.NickName = ""
    13. LogEntry("Client connected")
    14. Dim t As New System.Threading.Thread(AddressOf ListenToConnection)
    15. t.Start(NewCon)
    16. End While
    17. End Sub


    Wenn ich dann LThread.Abort() ausführe, friert die Anwendung komplett ein. Es wird keine Exception geworfen und nix.
    Vor dem Abort() wird "Client" natürlich beendet (Client.Close()). Bis dahin geht auch alles. Nur das Beenden des Threads LThread macht halt Probleme...
    Wenn du deinen Thread mit Abort beendest, muss alles im Thread in einen Try Catch Block stehen, der eine ThreadAbortedException abfängt. Statt While True könntest du allerdings eine Boolean Variable einsetzen - Wenn du deinen Thread sicher beenden willst musst du diese nur auf False setzen.
    Thread.Abort macht man auch nicht, das ist wie wenn Du Deinen PC ausschalten willst und Dynamit draufschmeißt und ihn hochjagst, um ihn auszukriegen.
    Warum willst Du den Thread denn abbrechen?
    #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 :!:
    Hallo,

    erstelle doch eine Variable running = True und dann ersetzt du While True durch While running
    und wenn du den abbrechen willst, machst du einfach running = False und dann beendet es die Schleife.

    MFG

    Alex-Digital :D
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Wieso genügt da ThreadPool.QueueUserWorkItem nicht? Bzw. wieso kam dieser Vorschlag noch nicht?
    EDIT: Gott bin ich blöd: Es ging ja ums Abbrechen... :S
    Na dann, so wie oben beschrieben: Mit einem Boolean abbrechen.
    Es gibt halt einen Knopf, der das Listening beenden soll. Es ist eine Server-Applikation, die auch funktioniert. Allerdings der Teil mit "Hör auf zu lauschen" (also den Thread mit dem Listening beenden) geht halt nicht. Hintergrund ist der, dass der Server modular aufgebaut wird und Updates installiert werden können. Zur Sicherheit kann man den Server dann quasi beenden, also das Lauschen beenden. Mit erneutem Klick soll der Thread dann wieder gestartet werden können. Ich muss das so machen, weil das Lauschen durch Listener.AcceptTcpClient den ganzen Hauptthread anhält, bis eine Verbindung aufgebaut wird. Andernfalls würde die GUI einfrieren. Daher der extra "Lausch-Thread". Jetzt ist halt nur die Frage, warum er sich nicht beenden läßt.
    Du lauschst in einer Schleife? Kannst du dort nicht mit einem Listener-Objekt(HTTPListener, oder was weiss ich) da ran gehen? Dann bräuchtest du weder einen neuen Thread, noch hättest du einen zugemüllten Thread, der auch noch beendet werden müsste.
    Wie wärs, wenn du das Richtige nutzt?
    Das System.Threading.CancellationToken in Verbindung mit System.Action erlaubt unglaubliche Flexibilität.
    Beispiel:

    Visual Basic-Quellcode

    1. Dim cancelToken As New CancellationTokenSource()
    2. Dim t As Action = DoSomething;
    3. Sub DoSomething()
    4. While (!cancelToken.IsCancellationRequested)
    5. ' Irgendetwas Do
    6. End While
    7. End Sub

    Irgendwo in deinem Code rufst du dann cancelToken.Cancel() auf, und du kannst dir sicher sein, dass der Thread beendet wird.
    Um den Thread zu starten reicht ein t.BeginInvoke([parameter], irgendeinCallback, Nothing).
    Threads waren schon immer veraltet - denn ein Thread beendet sich nicht, wenn das Programm "beendet" wird, sondern erst, wenn er dazu gezwungen wird - die Action, macht dies von sich aus.

    Zu dem sehe ich gerade, dass du versuchst mit TCP-Verbindungen zu jonglieren: wie wärs mit:
    System.Net.Sockets.TcpListener.BeginAcceptTcpClient()? Die schönere Variante - und vorallem schonendste.
    Ich hätte dir gerne ein Tutorial von @ErfinderDesRades gegeben, nur ist das komischerweise verschwunden (oder ich finde es nicht mehr)
    So .. das ist es: VersuchsChat mit leistungsfähigem Server

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „AliveDevil“ ()

    Zu deinem Problem, dann zu ner anderen Sache:

    Quellcode

    1. thread.isBackground = true
    2. thread.start()



    Ähm... Ich würde dir Raten, da es ausschaut als willst du nen Multi-Server schreiben, von diesem "Threadzeugs" wegzukommen. aus meinen Erfahrungen einen Multi-Server zu Entwickeln der auf dieser Methode arbeitet, wirst du schnell an grenzen stoßen. Da viele diesen Weg gehen über Threadlisten, wirst du wenns hoch komtm mal 100 Verbindungen haben. und dein Server wird arglich wegen Ressourcenverbrauch in die Knie gehen. Das mag jetz klingen wie "Wa? wat will der jetz?!" aber schau mal in den TaskManager und schau mal wie deine CPU arbeitet (obwohl dein Server nichts tut!, während er verbindungen hat, die aber nichts machen)

    Du solltest den Weg der Async-Programmierung gehen, das Grundgerüst ist schnell erstellt und ja deine CPU tut fast ... nichts :)

    schau dir einfach mal diesen Server von 4 Servern an, aus den Projekt PCGM (von mir)... Die beiden Files enthalten nur den Server und Clientcode und sollten ansich schon laufen beim copy und pasten :) Hab das Projekt nur aus Zeitgründen nicht weiter gemacht, da erstmal andere sachen anstehen.

    github.com/LipkeGu/PCGM/tree/master/Wol-Server/RCON

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