2009-11-03 5 views
6

J'essaie simplement d'effectuer une programmation socket, en utilisant des sockets non bloquantes en C#. Les différents échantillons que j'ai trouvés, tels que this, semble utiliser une boucle while (true), mais cette approche provoque l'éclatement du processeur à 100%. Existe-t-il un moyen d'utiliser des sockets non bloquantes en utilisant un style de programmation d'événements? MerciSocket non bloquant C# sans boucle while (true)

Répondre

6

Voir l'exemple MSDN here. L'exemple montre comment recevoir des données de manière asynchrone. Vous pouvez également utiliser les méthodes Socket BeginSend/EndSend pour envoyer des données de manière asynchrone.

Vous devez noter que le délégué de rappel s'exécute dans le contexte d'un thread ThreadPool. Ceci est important si les données reçues à l'intérieur du rappel doivent être partagées avec un autre thread, par exemple le thread d'interface utilisateur principal qui affiche les données dans un formulaire Windows. Si tel est le cas, vous devrez synchroniser l'accès aux données à l'aide du mot clé lock, par exemple.

Comme vous l'avez remarqué, avec des sockets non bloquantes et une boucle while, le processeur est ancré à 100%. Le modèle asynchrone appelle uniquement le délégué de rappel lorsqu'il existe des données à envoyer ou à recevoir.

3

Parler généralement sur le blocage/non-blocage IO, applicable en général:

L'essentiel est que dans la vraie vie de votre programme ne autres tout en ne faisant pas IO. Les exemples sont tous conçus de cette manière. En bloquant l'E/S, votre thread se bloque en attendant les E/S. L'OS va et fait d'autres choses, par ex. permet aux autres threads de s'exécuter. Ainsi, votre application peut faire beaucoup de choses (conceptuellement) en parallèle en utilisant plusieurs threads.

Dans les E/S non bloquantes, votre thread interroge pour voir si les E/S sont possibles, et sinon il fait autre chose. Donc, vous faites beaucoup de choses en parallèle par un échange explicite - au niveau d'une application - entre eux.

+0

Cette réponse donne une idée de la raison pour laquelle on voudrait faire des E/S non bloquantes, mais ne répond pas vraiment à la question de savoir comment l'implémenter. – squawknull

0

Socket.BeginReceive et AsyncCallback

4

Pour éviter un problème de processeur dans une boucle lourde, lorsque aucune réception de données n'affiche thread.sleep(100) ou moins. Cela permettra à d'autres processus de changer pour accomplir leur tâche.