Domanda

Stavo armeggiando con la comunicazione TCP di Silverlight e sono stato costretto a utilizzare la classe System.Net.Sockets.Socket che, durante il runtime di Silverlight ha solo metodi asincroni.

Mi chiedevo cosa succede se due thread chiamano SendAsync su un'istanza Socket in un tempo molto breve l'uno dall'altro?

La mia unica preoccupazione è di non avere byte mescolati che attraversano il canale TCP.

Essendo un metodo asincrono Suppongo il messaggio viene inserito in una coda dalla quale un singolo thread si stacca per evitare che ciò accada (mescolando il contenuto del messaggio sul filo).

Ma non ne sono sicuro e MSDN non indica nulla nella descrizione del metodo. Qualcuno è sicuro di questo?

EDIT1: No, bloccare un oggetto prima di chiamare SendAsync come:

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

non sarà di aiuto in quanto ciò serializza le richieste di invio di dati non i dati effettivamente inviati.

È stato utile?

Soluzione

Per chiamare il SendAsync devi prima aver chiamato ConnectAsync con un'istanza di SocketAsyncEventArgs . È l'istanza di SocketAsyncEventArgs che rappresenta la connessione tra client e server. La chiamata di SendAsync con la stessa istanza di SocketAsyncEventArgs che è stata appena utilizzata per una chiamata in sospeso a SendAsync comporterà un'eccezione.

È possibile effettuare più chiamate in sospeso verso SendAsync dello stesso oggetto Socket ma utilizzando solo istanze diverse di SocketAsyncEventArgs . Ad esempio (in un universo parallelo dove questo potrebbe essere necessario) potresti creare più post HTTP sullo stesso server contemporaneamente ma su connessioni diverse. Ciò è perfettamente accettabile e normale né client né server verranno confusi su quale pacchetto sia quale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top