Creo que lo hace de la misma manera que cualquier otra operación asincrónica en .NET: llama a la versión BeginXxx del método, en este caso BeginAcceptSocket. Su devolución de llamada se ejecutará en el grupo de subprocesos.
Los subprocesos agrupados generalmente escalan mucho mejor que el subproceso por conexión: una vez que se superan unas pocas decenas de conexiones, el sistema trabaja mucho más duro al cambiar entre subprocesos que al realizar el trabajo real. Además, cada subproceso tiene su propia pila que suele tener un tamaño de 1 MB (aunque depende de los indicadores de enlace) que debe encontrarse en el espacio de direcciones virtuales de 2 GB (en sistemas de 32 bits); en la práctica, esto te limita a menos de 1000 hilos.
No estoy seguro de si el threadpool de .NET lo usa actualmente, pero Windows tiene un objeto kernel llamado I/O Completion Port que ayuda a E/S escalable. Puede asociar subprocesos con este objeto y las solicitudes de E/S (incluida la aceptación de conexiones entrantes) se pueden asociar a él. Cuando finaliza una E/S (por ejemplo, llega una conexión), Windows lanzará un hilo en espera, pero solo si el número de subprocesos actualmente ejecutables (no bloqueados por algún otro motivo) es inferior al límite de escalabilidad configurado para el puerto de finalización. Por lo general, establecería esto en un pequeño múltiplo de la cantidad de núcleos.
Gracias por el código fuente, voy a codificarlo así. Los hilos nuevos pueden ser costosos, pero como no he escalado más de 5 o 6 conexiones entrantes concurrentes, esto estará bien por ahora. –
Think listener y tcpListener se confundieron en el ejemplo, de lo contrario el código es bueno. Encontrado esto: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.beginaccepttcpclient.aspx basado en lo que me he apoyado aquí. –
El código actual es altamente peligroso en el contexto de rendimiento lo editaré ... – Beygi