herunterladen Ich glaube, Sie tun es auf die gleiche Weise wie jede andere asynchrone Operation in .NET: Sie rufen die BeginXxx-Version der Methode, in diesem Fall BeginAcceptSocket. Ihr Rückruf wird im Thread-Pool ausgeführt.
Gepoolte Threads skalieren im Allgemeinen viel besser als Threads pro Verbindung: Sobald Sie einige Dutzend Verbindungen überwunden haben, arbeitet das System beim Wechseln zwischen Threads viel härter als beim Ausführen der eigentlichen Arbeit. Zusätzlich hat jeder Thread seinen eigenen Stack, der typischerweise 1 MB groß ist (obwohl er von Link-Flags abhängt), der im virtuellen 2-GB-Adressraum (auf 32-Bit-Systemen) gefunden werden muss; In der Praxis beschränkt dies Sie auf weniger als 1000 Threads.
Ich bin nicht sicher, ob .NET Threadpool es derzeit verwendet, aber Windows hat ein Kernel-Objekt namens I/O Completion Port, die in skalierbare E/A hilft. Sie können diesem Objekt Threads zuordnen, und E/A-Anforderungen (einschließlich der Annahme eingehender Verbindungen) können damit verknüpft werden. Wenn ein E/A abgeschlossen ist (z. B. eine Verbindung eintrifft), gibt Windows einen wartenden Thread frei, jedoch nur, wenn die Anzahl der aktuell ausführbaren Threads (aus einem anderen Grund nicht blockiert) kleiner als das konfigurierte Skalierbarkeitslimit für den Completion-Port ist. Normalerweise würden Sie dies auf ein kleines Vielfaches der Anzahl der Kerne einstellen.
Danke für den Quellcode, ich werde es so codieren. Neue Threads können teuer sein, aber da ich nicht mehr als 5 oder 6 gleichzeitige eingehende Verbindungen skalieren kann, wird dies für jetzt in Ordnung sein. –
Think Listener und TcpListener wurde in Beispiel verwirrt, sonst guten Code. Gefunden diese: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.beginaccepttcpclient.aspx basierend auf was ich hier gelehnt. –
Aktueller Code ist sehr gefährlich im Performance-Kontext Ich werde es bearbeiten ... – Beygi