2010-01-15 5 views
0

J'ai une classe wrapper socket qui envoie et reçoit des messages avec un serveur (en particulier des commandes, des réponses et des notifications). J'ai aussi une classe consommatrice qui sérialise les commandes en texte à envoyer à travers le wrapper. Mon problème est que quand une commande est envoyée, je dois attendre jusqu'à ce que je reçoive un message avec un en-tête particulier. Lorsque je fais cela, la classe consommatrice se verrouille lorsque j'utilise ManualResetEvent.WaitOne qui est défini par ma méthode de réception. La raison pour laquelle c'est un problème lorsque ma classe consommatrice se verrouille est qu'un autre message peut être reçu entre temps et je ne peux pas le traiter. Est-il possible de verrouiller un objet spécifique afin que ma classe puisse toujours répondre à d'autres événements?C# Blocage des communications par socket asynchrone

méthode Send:

_waitingCommands.Enqueue(command); 
    String commandText = command.ToString(); 
    _socket.Send(commandText); 

méthode receive:

if (response.Header.Type == Messages.MessageType.Response) 
{ 
    if (command.Response == null) 
     command.Response = response; 

    _waitingCommands.Dequeue(); 
    command.Finished.Set(); 
} 

Répondre

0

Utilisez socket.BeginSend et socket.BeginReceive. Ceux-ci vont essorer des fils séparés qui permettront à votre fil principal de continuer le traitement. Une fois que les données sont envoyées ou reçues, les méthodes que vous avez connectées à la méthode BeginSend/BeginReceive se déclenchent, dans un ordre logique.

Begin Send

BeginReceive

Questions connexes