Veulent un .Net, Prise de Gestionnaire d'Événement pour l'entrée de données
Je réécris un ancien VB6 programme en C# (.Net Framework 4.0). Il communique avec une pièce d'équipement industriel sur le plancher de l'usine. VB6 utilisé quelques vieux COM socket logiciel, je suis en utilisant le .Net de la classe Socket.
Quand j'envoie un message à l'équipement, j'attends une réponse donc je sais écouter. Mais l'équipement peut également envoyer des messages de manière asynchrone sans avertissement (par exemple, pour indiquer une panne ou de problème). J'ai donc toujours avoir à recevoir de ceux-ci. Donc ce que je voudrais vraiment est un gestionnaire d'événement qui est appelée à chaque fois que quelque chose vient de l'équipement.
De la classe Socket semble utiliser un BeginReceive/EndReceive régime pour recevoir le traitement des événements. Puis-je simplement faire un BeginReceive une fois au début de mon programme pour définir un gestionnaire d'événements pour tous les messages entrants, ou ce que je dois constamment faire BeginReceive/EndReceive est tout au long de mon programme?
Merci d'avance pour clarifier la manière correcte de le faire.
Aucune idée de pourquoi cela avait été downvoted: C'est tellement bien écrit qu'à la condition de répondre non seulement résout ce problème, mais aussi mon problème, j'ai été sur le point de publier.
OriginalL'auteur user316117 | 2013-01-08
Vous devez vous connecter pour publier un commentaire.
Êtes-vous le serveur?
Si vous êtes le serveur, vous écouter pour une connexion de socket, puis accepter la connexion de socket et de les stocker. Vous pourrez ensuite appeler
BeginReceive
avec la stockées socket. Dans leBeginReceive
méthode, vous devrez fournir une fonction de rappel pour recevoir et traiter les données.Une fois que vous recevez des données, la fonction de rappel qui se passe. La fonction de rappel d'appel
EndReceive
sur la stockées de connexion. C'est là que vous obtenez/gérer les données. Vous ferez également appelBeginReceive
encore attendre pour plus de données.De cette façon, le
BeginReceive
etEndReceive
sera exécuté dans un cercle: vous êtes toujours de la réception de données, et en attente de plus de données.Voici un exemple:
EDIT:
Selon votre commentaire, voici un exemple en C# d'un client asynchrone: http://msdn.microsoft.com/en-us/library/bbx2eya8.aspx.
La
BeginReceive
/EndReceive
travail similaire sur le serveur.Oui, BeginReceive est appelé à la fonction de rappel. EndRecieve permettra d'obtenir les données de la recevoir. Dans votre rappel: Vous appelez EndReceive, puis de gérer les données et ensuite appeler BeginReceive.
re "Êtes-vous le serveur?" Le PC initie la connexion, l'équipement est à l'écoute de l'un, bien que le PC et l'équipement de l'usine, peut initier la transmission de données sans y être invité par l'autre. Donc, je crois que c'est le PC du client.
J'ai ajouté un exemple simple de beginReceive/EndReceive
Le code C# que je vais expliquer, et les exemples sont liés pour les sockets asynchrones. Votre devez utiliser BeginReceive/EndReceive pour effectuer les opérations de socket en mode asynchrone. Si vous ne souhaitez pas utiliser les sockets asynchrones alors vous pouvez utiliser sychronous sockets: msdn.microsoft.com/en-ca/library/kb5kfec7.aspx.
OriginalL'auteur Mausimo