Hallo leute,
mir gehts genauso, ich habe einen Blockierenden Thread welcher aufgrund der TCP Server Datenanbindung nicht mehr zu terminieren ist.
Gibt es irgendeine saubere Lösung dafür?
Problem tritt in Zeile 13 auf, weil die blokierende Funktion BLOCKIERT
C#-Quelltext
1:
| Socket sock = listen.AcceptSocket(); |
Ablauf:
Create Listening Thread
Listen
Accept
Create Next Listening Thread
...
...
while(Receiving data)
Dies wurde deshalb so implementiert weil ein Client über den gesamten Zeitraum hinweg immer mit dem Server verbunden bleibt. Dies ist nötig da der Server auch asynchrone meldungen an alle clients senden können muss.
Nachdem ich C# erst seit 4 Tagen in Verwendung habe kann es sein dass die klasse etwas zusammengeflickt aussieht, aber bis jetzt funzts
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| class Server { static int mListen = 0; static int mConnection = 0; static List<Thread> mCrtTreads = new List<Thread>();
static void DoListen() { IPAddress[] IPs = Dns.GetHostAddresses("localhost"); TcpListener listen = new TcpListener(IPs[0], 22025); listen.Start(); Socket sock = listen.AcceptSocket(); StartListen();
long size = 0; List<byte> buf = new List<byte>();
do { size = sock.Receive(buf.ToArray()); if (size > 0) {
} else { sock.Disconnect(true); sock.Close(); } } while (size > 0); Console.WriteLine("Communication Thread terminated / client disconnected"); }
public static void StartListen() { Thread t = new Thread(new ThreadStart(DoListen)); t.Name = "Listenthread " + (mListen++).ToString(); Console.WriteLine("[started] " + t.Name.ToString()); mCrtTreads.Add(t); t.Start(); }
public static void Kill() { Console.WriteLine("Killing Threads... " + mCrtTreads.Count.ToString()); foreach (Thread i in mCrtTreads) { i.Interrupt();
Console.WriteLine("..." + i.Name.ToString()); i.Abort();
} mCrtTreads = null; } } |
mfg george