2 a 6 tomas de corriente (comentarios) es, probablemente, en el lugar interesante donde ya sea bloqueando o asíncrono IO no tendrán ningún problema, ya que no están inundando la máquina con hilos. Con 2000 paquetes por segundo, parece que hay mucho para mantener los hilos ocupados. No necesita preocuparse por while(true)
desde una perspectiva de rendimiento, ya que el método Receive
se bloqueará hasta que los datos estén disponibles, por lo que es nunca haciendo un hot-loop de no hacer nada. ¡Sin embargo! En lo personal, desde el punto de vista estético, estoy de acuerdo while(true)
es una mancha innecesaria, por lo que si usted está utilizando el enfoque de bloqueo, tal vez considero:
int bytesRead;
while((bytesRead = socket.Receive(buffer)) > 0) {
// process bytesRead from buffer
}
que salir limpiamente cuando se cierra el socket.
Usted También puede hacer esto con cualquiera de las BeginReceive
y Socket.ReceiveAsync
métodos, que no utiliza una llamada de bloqueo, sino que utiliza ya sea un evento o de devolución de llamada. Estos son particularmente útiles cuando se manejan muchas conexiones.
Personalmente, lo que tiendo a hacer es usar Socket.Available
; si esto es positivo, entonces hay datos almacenados en búfer y listos para consumir, por lo que se puede usar un simple Receive
para obtener esos datos de manera inmediata y sin un cambio de contexto. Si es cero, entonces no hay datos disponibles en actualmente, por lo que una llamada asincrónica puede ser más apropiada. Esto equilibra los cambios de contexto con llamadas directas. Tenga en cuenta que el enfoque ReceiveAsync
ha esta construida en también, a través del valor de retorno de ReceiveAsync
(que es true
si la operación es incompleta, y una devolución de llamada se invoca después - y false
si la operación es ya completa, y sin se invocará la devolución de llamada).
¿Qué llamada específica está utilizando para escuchar nuevos paquetes? hay muchas formas en que se puede hacer, y es importante. Además: ¿cuál es la naturaleza de la aplicación? ¿Cuántas transmisiones está escuchando también? si solo esta (o algunas), entonces un hilo dedicado y llamadas de lectura de bloqueo probablemente no sean un problema.Para un servidor dedicado con docenas o cientos o miles de conexiones, definitivamente querrá usar devolución de llamada IO o Socket.Select. –
@MarcGravell Debo escuchar varias tomas (de 2 a 6), estoy usando hilo dedicado para cada Socket. Recibo ~ 2000 paquetes por segundo en cada socket – javapowered