¿Se puede usar async / await en C # para programar un servidor TCP? Dado que en realidad no están creando un nuevo hilo, ¿el servidor colapsará bajo demasiados clientes?

Escribir un servidor TCP de alto rendimiento es difícil. Si tiene de 100 a 10,000 solicitudes por segundo, consideraría seriamente usar la tecnología existente en lugar de reinventar la rueda. Puede cambiar a HTTP y usar un servidor web existente como IIS o Apache. Están altamente optimizados, vienen con toneladas de registro y rastreo, y pueden ajustarse. Alternativamente, si tanto los clientes como el servidor son .NET, puede usar WCF.

Si tiene más de 10,000 solicitudes por segundo, probablemente no quiera usar C # en primer lugar. Desea C o C ++ y alguna caja de Linux estrechamente controlada. No soy realmente un experto en este.

Crear una nueva hebra por conexión TCP es una mala idea. Los subprocesos son lentos para crear, requieren toneladas de recursos y su servidor se ahogará bastante rápido. Si sus solicitudes se procesan rápidamente, el uso del grupo de subprocesos es una opción mucho más eficiente. Apache en Windows utiliza puertos de finalización de E / S, que funcionan con el grupo de subprocesos como async / wait, pero en un nivel mucho más bajo.

Dicho esto, puede forzar a la Biblioteca de tareas a crear un nuevo subproceso para su tarea si utiliza la opción LongRunning : consulte Cómo garantizar que se cree un nuevo subproceso cuando se utiliza el método Task.StartNew.

Pregunta:

¿Se puede usar async / await en C # para programar un servidor TCP? Dado que en realidad no están creando un nuevo hilo, ¿el servidor colapsará bajo demasiados clientes?

Responder:

Está malinterpretando lo que hace async y esperar, cómo se comporta y cómo los clientes interactúan con un servidor TCP.

Ejemplo de socket de servidor asíncrono (el lado derecho de la página le permite cambiar el idioma de VB a C #)

El enlace lo lleva directamente a la documentación de Microsoft sobre el tema, completa con el código fuente.

Una última cosa a tener en cuenta. Se recomienda utilizar técnicas de programación asincrónica con la mayoría de los programas modernos escritos en C #. Debido a que la programación asincrónica funciona extremadamente bien con el procesador múltiple y el mundo multitarea en el que vivimos hoy.

async / await ejecuta Tareas en un grupo de subprocesos, y creo que, de forma predeterminada, el tamaño del grupo de subprocesos es la cantidad de subprocesos de hardware que admite su computadora. es decir, tiene 2 núcleos, con HyperThreading, que hace que un núcleo actúe como 2 núcleos, por lo que tiene 4 hilos admitidos en el hardware.

El medio asíncrono / espera está jugando en 4 hilos, no en 1. Sin embargo, puede aumentar el número de hilos:

Método ThreadPool.SetMaxThreads (System.Threading)

Supongo que depende exactamente de lo que está buscando lograr, pero async / wait me parecería un excelente modelo para un servidor de red.