Wunderschönen gute Tag!
Kurz die Fragestellung: Kann ich das Blockieren von Socket.Accept() irgendwie umgehen?
Der Hintergrund ist wie folgt... Ich würde gerne meine Server-Consolen-Anwendung über die Console beenden... Nun habe ich allerdings festgestellt, dass der Thread, der die ganzen Verbindungen annimmt, genau an der Stelle des Accept blockiert (Was auch die Literatur wiedergibt). Und genau das Blockieren verhindert das ordnungsgemäße beenden des Servers.
Muss ich daher den Weg über Socket.BeginnAccept() gehen? Oder kann ich einen Timer irgendwie setzen? Und wenn ja, wäre das überhaupt der sinnvolle weg?
lauscher = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try{
lauscher.Bind(ep);
lauscher.Listen(100);
while(!_beenden){
Console.WriteLine("in while..");
anwenderGeraet.Add(lauscher.Accept());
Console.WriteLine("eingehender Anruf :-)");
Thread.Sleep(50);
}
Console.WriteLine("Verbindung.cs: beendet..");
}
catch(Exception ex){
Console.WriteLine("Fehler: " + ex);
}
Gruß Frokuss
Okay, ich danke euch für eure Hilfe XD
if(lauscher.Poll(10, SelectMode.SelectRead)){
Jetzt muss ich nur noch die feinheiten zwischen den SelectModes verstehen... Aber zumindestens sieht es jetzt besser aus 😃
Gruß Frokuss
Korrekt würde es mit AcceptAsync funktionieren.
Alternativ BeginAccept (mit EndAccept). Dies sind asynchrone Pattern, die cancelbar sind.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code