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
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.
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.
Socket.BeginReceive et AsyncCallback
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.
- 1. Socket non bloquant
- 2. temporisateur bloquant/non bloquant dans C
- 3. Vérification constante d'un port sans boucle while
- 4. Getch(), non bloquant, ncurses
- 5. Flush Socket bloque l'appel en SocketHi non bloquant
- 6. Comment fermer correctement un canal de socket non bloquant?
- 7. Achèvement de sendfile() sur un socket non bloquant
- 8. Opération de vidage pour le socket non bloquant Java
- 9. Appel non-bloquant vs select()
- 10. comment faire non bloquant accept() en Python?
- 11. fichier non-bloquant openat()
- 12. Erreur 10035 sur un socket bloquant
- 13. Comment faire un appel socket non bloquant en C# pour déterminer l'état de la connexion?
- 14. tcp non bloquant se connecter avec epoll
- 15. CAS et compteur non bloquant
- 16. Mise à jour du wx.gauge sans boucle while
- 17. Curses - Effectuer un contrôle non bloquant sur stdin - C
- 18. Boucle imbriquée dans une boucle while - Java
- 19. Non-blocage Socket Polling vs Blocage socket
- 20. Java Non-bloquant Lecture
- 21. Non bloquant pthread_join
- 22. Sortie immédiate de la boucle 'while' en C++
- 23. OpenCV 'cvQueryFrame' non bloquant sur OS X?
- 24. C# Est-ce qu'une boucle while foreach parallèle est possible?
- 25. Quelle est la différence entre while (true) et loop?
- 26. Checkbox dans une boucle while
- 27. Annulation prématurée d'une boucle While
- 28. Motif dans la boucle while
- 29. Boucler une méthode sans for/foreach/while
- 30. C++ Winsock socket non-bloquante/asynchrone UDP
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