Question

Je bidouillais avec la communication TCP de Silverlight et j'ai été obligé d'utiliser la classe System.Net.Sockets.Socket qui, sur le runtime de Silverlight, ne comporte que des méthodes asynchrones.

Je me demandais ce qui se passait si deux threads appelaient SendAsync sur une instance de Socket dans un très court laps de temps?

Mon seul souci est de ne pas avoir d'octets mélangés passant par le canal TCP.

Étant une méthode asynchrone je suppose , le message est placé dans une file d'attente à partir de laquelle un seul thread se met en file d'attente, de sorte que rien de tel ne se produira (mélange du contenu du message sur le réseau).

Mais je ne suis pas sûr et le MSDN ne dit rien dans la description de la méthode. Quelqu'un en est-il sûr ?

EDIT1: Non, verrouiller un objet avant d'appeler SendAsync tel que:

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

ne vous aidera pas car cela sérialise les demandes d'envoi de données et non les données réellement envoyées.

Était-ce utile?

La solution

Pour appeler SendAsync , vous devez d'abord avoir appelé ConnectAsync avec une instance de SocketAsyncEventArgs . C'est l'instance de SocketAsyncEventArgs qui représente la connexion entre le client et le serveur. L'appel de SendAsync avec la même instance de SocketAsyncEventArgs qui vient d'être utilisé pour un appel en attente à SendAsync donnera lieu à une exception.

Il est possible d'effectuer plusieurs appels en attente vers SendAsync du même objet Socket , mais uniquement à l'aide d'instances différentes de SocketAsyncEventArgs . Par exemple (dans un univers parallèle où cela peut s'avérer nécessaire), vous pouvez créer plusieurs publications HTTP sur le même serveur simultanément, mais sur des connexions différentes. Ceci est parfaitement acceptable et normal, ni le client ni le serveur ne seront confus quant au choix du paquet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top