AcceptTcpClient() verhindert das sich mein Programm schliesst
-
Ich habe ein Programm das von einen Service auf einen anderen Rechner übers Netzwerk Daten erhält.Das läuft auch.Aber wenn ich das Programm schließen will hängt es bei AcceptTcpClient() und der Thread in den ich es aufrufe lässt sich auch nicht aborten.
public void Start() { Register(); //Sendet die IP zum Dienst ,damit dieser weiss wohin er die Daten senden soll if (t != null) t.Abort(); t= new Thread(Listen); t.Start(); } void Listen() { TcpListener listener = new TcpListener(876); listener.Start(); while(run) { while (listener.Pending()) { if (!run) { listener.Stop(); return; } } Thread t = new Thread(Read); //Read ist die Funtion die die Daten verarbeitet TcpClient client = listener.AcceptTcpClient(); //Hier häng das Programm beim Schliessen t.Start(client); } listener.Stop(); } public void Stop() { run = false; Register(); //Bei nochmaligen Senden der IP hört der Dienst auf Daten an diese IP zusenden t.Abort(); }
-
Lesen bildet...
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient.aspx
zitat:
"AcceptTcpClient is a blocking method"
-
Blocking heist das der Programmablauf wartet bis die Methode ein Ergebnis zurückliefert,das erklärt nicht warum die Methode sich bei Programmende aufhängt.
-
Was verstehst Du denn unter aufhängen ?!
-
Er sucht vermutlich eine Möglichkeit, den blockierenden Aufruf zu unterbrechen, ohne dass ein Client verbindet...
-
Nein ich schliesse das Programm und der Thread bliebt ewig offen und wenn ich in debugging unterbreche lande ich immer bei AcceptTcpClient.Der Client müsste ja eigentlich verbinden da ich den Dienst ja nicht beendet habe ,also am anderen Ende der Verbindung alles normal läuft.
-
Andorxor schrieb:
Blocking heist das der Programmablauf wartet bis die Methode ein Ergebnis zurückliefert,das erklärt nicht warum die Methode sich bei Programmende aufhängt.
Natürlich erklärt es das. Der Thread steht im blocking call (aka suspended) und daher kann der Thread nicht beendet werden. Ich tipp mla drauf das es sich um einen zusätzlich gestarteten Thread handelt der nciht als Background markiert wurde. Solche Thread werden beim beenden des Programms nicht automatisch terminiert.
-
Das erklärt nicht warum AcceptTCpClient nicht endet.
-
Naja, irgendwie doch schon. Dein Thread steht in einer blocking methode und warted auf einen Connect. Solange kein Connect kommt läuft der Thread weiter, auch wenn Du das Programm beendest, weil der Thread unabhängig vom Hauptprogramm existieren kann. (Eventuell solltest Du IsBackground bei worker-Thread auf true setzen oder gleich ThreadPool verwenden).
Dein eigendlicher Fehler liegt hier:
while (listener.Pending()) { if (!run) { listener.Stop(); return; } }
Schau mal GENAU auf die while-Bedingung und denk mal scharf nach...
Richtig, wenn der Listener leer ist ist Pending false, also wird die while-Schleife komplett übersprungen und der Thread landet direkt im blocking call AccepTCPClient....