Thread beenden geht nicht?

moson

Mitglied
Hi Leute,

ich hab in einem Programm ein Thread erstellt. In diesem Thread wird nun eine Endlosschleife ausgeführt. In der Schleife empfängt ein NetworkStream immer neue Daten vom Server (wenn er welche sendet). Wenn ich den Thread nun von aussen beenden will mit:

Thread.Abort();

funktioniert die leider nicht. Hier mal ein bisschen coding...

Code:
public void Listener()
{
	while(active)
	{
	int dataLaenge = nwstream.Read(puffer, 0, tcpclient.ReceiveBufferSize);
	string recievedData = Encoding.ASCII.GetString(puffer);
	textBox3.AppendText("\r\n" + recievedData.Substring(0, dataLaenge));	
	textBox3.Focus();
	textBox3.ScrollToCaret();
	textBox4.Focus();
	}
}

^
|
Das ist die Methode die im Thread ausgeführt wird...

Code:
private void button1_Click(object sender, System.EventArgs e)
{
	tcpclient = new TcpClient(textBox1.Text, Convert.ToInt32(textBox2.Text));
	nwstream = tcpclient.GetStream();
	puffer = new byte[tcpclient.ReceiveBufferSize];

	listen = new Thread(new ThreadStart(Listener));
         listen.Start(); 
}

^
|
Thread wird instanziert und gestartet.

Code:
private void menuItem1_Click(object sender, System.EventArgs e)
{
	active = false;
	listen.Abort();
	Application.Exit();
}

^
|
Damit soll das ganze eigentlich beendet werden. Die Form Schließt sich zwar, aber der Prozess bleibt bestehen, man muss ihn dann extra im Task Manager abwürgen...

Hat jemand ne Idee was ich verändern könnte damit es läuft?
 
Das is irgendwie doppelt gemoppelt was du da machst, Thread.Abort beendet den Thread (nicht gleich aber innerhalb von wenigen Sekunden) und dein Active bool beendet den Thread auch, du brauchst eigentlich nur eines von beiden . .

Ich würde auch ein lock() hier und da anbringen sonst kriegst du Probleme wenn du mehrere Threads benutzt . . .

Das Problem warum der Prozess sich nicht beendet würde ich mal vermuten liegt daran dass du den Thread mehrfach startest? Wenn du mehrfach auf button1 klickst wird jedes Mal der Thread gestartet, du merkst dir aber nur eine Instanz davon und kannst auch nur die abbrechen . . .
 
Ne, der Thread wird nur einmal gestartet. mit dem Bool "active" haste recht, das ist eigentlich doppelt gemoppelt, ich hab nur nachher alles probiert.

Warscheinlich liegt es daran das der noch auf ne Antwort vom Server wartet. In dem Thread wird nämlich aus dem Stream ausgelesen. Das Thread.Abort(); kann den Thread aber dann leider nicht weghauen...
 
Hm das wäre mir neu, das Abort wirft innerhalb von dem Thread ne Exception damit er beendet wird, die kann man sogar abfangen :D

Ich hab schon erlebt, dass es etwas länger dauert bis sich ein Thread beendet aber beendet haben sich noch alle gg

Hast du Visual Studio? Da kannst du dir ja mal die Threadliste angucken, ob da noch was am laufen ist, ansonsten schick mir mal ne kleine Version von deinem Code der den Fehler produziert, dann kann ichs mal testen
 
Der will sich einfach nicht beenden. Im Task Manager verbleibt das Ding einfach. Ich hab mal 5 Minuten abgewartet, doch da tut sich nichts.

Meinst du mit Threadliste die Prozessliste?
 
Nein Im VisualStudio hast du beim Debuggen eine Liste der aktuellen Threads die gerade ausgeführt werden, das is ganz nützlich aber gibts glaub ich nur beim VS
 
Ich hab VS.NET 2003, ich find das da nirgendwo, ich such nochmal, aber der Thread muss da aufgelistet sein, da der Prozess ja im Taskmanager noch besteht.

:edit:

Scheint wohl die Prozessliste vom Debugger zu sein...
 
Zuletzt bearbeitet:
Ich hab dir mal nen Screenshot gemacht, wenn du pausiert hast kannst du da drin die ganzen Threads sehen . . .

Dann weisst du ja ob es an dem einen Thread liegt oder an was Anderem

Hm ich musste en Stück abschneiden weil man hier nur 600*600 uppen kann aber man kanns noch erkennen
 

Anhänge

  • thread.jpg
    thread.jpg
    60,6 KB · Aufrufe: 430
Aso, jo das hab ich jetzt auch, dabei hab ich gemerkt das bei nem Buttonklick noch ein anderer Thread gestartet wird. Auch wenn dabei kein Code ausgeführt wird. Sehr merkwürdig, ich muss mir das alles nochmal angucken...

Habs jetzt gelöst indem ich vorm beenden des Threads noch in den Stream schreibe. Jetzt wird der Thread dann auch beendet!

Code:
string end = "QUIT\r\n";
nwstream.Write(Encoding.ASCII.GetBytes(end), 0, end.Length);
 
Zuletzt bearbeitet:
Zurück