c# TcpListener asíncrono BinaryFormatter.Deserialize

Tengo una aplicación de servidor inteligente TcpListener + TcpClient realmente simple. Acepto conexiones entrantes asíncronas. Luego leo datos del flujo de red.

Ejecuto este código en un hilo nuevo. pero tengo que ejecutar un nuevo hilo para cada cliente...

while (true)
    (MyCoreMessage)BinaryFormatter.Deserialize(TcpClient.GetStream())

¿Existe alguna forma asincrónica (fácil y simple) de desrializar el objeto de la red? No se crea un hilo nuevo por cliente...

gracias por la ayuda

preguntado el 03 de mayo de 12 a las 19:05

¿Cómo un solo hilo realizaría un seguimiento de cada flujo y lo bloquearía de manera adecuada? Esto parece un mal enfoque. -

Lo que preguntas no tiene sentido para mí. ¿No puede leer de un solo NetworkStream en varios subprocesos de todos modos? ¿Qué tiene que ver asíncrono con esto? Simplemente abra un nuevo hilo por conexión. -

Lo siento. Probablemente no lo expresé con precisión. Pregunta actualizada. -

1 Respuestas

Le sugiero encarecidamente que preceda los datos con un prefijo de longitud (por ejemplo, como orden de bytes de red de 4 bytes) y lea esta longitud en el primer. Entonces sabe cuántos datos esperar en el siguiente cuadro, por lo que buffer esa cantidad de datos usando lecturas asíncronas (suponiendo que el tamaño no sea demasiado grande). Cuando haya terminado de almacenar en búfer los datos (async), luego puede usar algo como MemoryStream y deserializar normalmente.

Esta:

  • permite un encuadre adecuado
  • le permite comprobar la cordura de la longitud
  • le permite hacer todo el acceso a la red como asíncrono
  • le permite involucrar solo al deserializador cuando sabe que tiene datos sensibles

contestado el 03 de mayo de 12 a las 19:05

está bien. Muchas gracias. estaba esperando eso Será más escribir código que simplemente llamar a "BinaryFormatter.Deserialize()" ;) - Marek Javůrek

@Marek sí, probablemente lo hará :p - marc gravell

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.