Pregunta

Estaba jugando con la comunicación TCP de Silverlight y me vi obligado a usar la clase System.Net.Sockets.Socket que, en el tiempo de ejecución de Silverlight, solo tiene métodos asincrónicos.

Me preguntaba ¿qué sucede si dos hilos llaman a SendAsync en una instancia de Socket en muy poco tiempo, uno del otro?

Mi única preocupación es no tener bytes entremezclados pasando por el canal TCP.

Siendo un método asíncrono supongo que el mensaje se coloca en una cola desde la que se descuelga un solo hilo para que no sucedan tales cosas (mezclando el contenido del mensaje en el cable).

Pero no estoy seguro y el MSDN no indica nada en la descripción del método. ¿Alguien está seguro de esto?

EDIT1: No, bloqueando un objeto antes de llamar a SendAsync como:

lock(this._syncObj)
{
    this._socket.SendAsync(arguments);
}

no ayudará, ya que esto serializa las solicitudes para enviar datos, no los datos realmente enviados.

¿Fue útil?

Solución

Para llamar a SendAsync primero debe haber llamado a ConnectAsync con una instancia de SocketAsyncEventArgs . Es la instancia de SocketAsyncEventArgs que representa la conexión entre el cliente y el servidor. Llamar a SendAsync con la misma instancia de SocketAsyncEventArgs que acaba de usarse para una llamada pendiente a SendAsync dará como resultado una excepción.

Es posible realizar múltiples llamadas pendientes a SendAsync del mismo objeto Socket pero solo usando diferentes instancias de SocketAsyncEventArgs . Por ejemplo (en un universo paralelo donde esto podría ser necesario), podría estar haciendo múltiples publicaciones HTTP en el mismo servidor al mismo tiempo pero en diferentes conexiones. Esto es perfectamente aceptable y normal, ni el cliente ni el servidor se confundirán acerca de qué paquete es cuál.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top