Bei der BeginAcceptTcpClient Lösung brauchst du nichteinmal einen extra Thread erstellen, starte einfach BeginAcceptTcpClient und wenn ein Client Acceptet wurde (dein Callback aufgerufen wurde) startest du es nochmal, fertig.
Einfach alles mit EndProcess beenden ist eine sehr schlechte Idee, wer weiß was der Thread unter umständen noch für Systemresourcen geöffnet hat, zB könnte er irgendwelche Ports blockieren, bis diese dann automatisch durch irgendwelche Timeouts wieder freigegeben werden, noch dazu ist sowas sehr unsauber, ich würde dafür zu Recht eins auf den Deckel bekommen, sollte ich meinen Code so schreiben.
Thread.Sleep sollte man nur verwenden wenn man weiß das man warten MÖCHTE und nicht warten MUSS. Und selbst für die MÖCHTE Situation gibt es meist andere Lösungen. Mit Thread.Sleep(wert > 1) blockiert der Thread für die angegebene Anzahl an Millisekunden und nichts kann ihn davon abbringen (Bis Thread.Kill oder solche Spielereien.). Dies ist ein Verhalten welches man meist nicht haben möchte.
Btw einem Thread zu signalisieren dass er sich beenden soll, bzw seine Aufgabe erledigt ist, macht man normalerweise eher nicht mit einer bool Variable sondern mit WaitHandles und ähnlichem.
mfg Mark