Je construis un client IRC et je veux une classe de réseau IRC indépendante qui envoie et reçoit des lignes entre le client et le serveur. L'envoi de lignes est OK, mais je ne sais pas comment mettre en place un thread d'écoute. Toutes les méthodes que j'ai essayé fonctionnent, mais j'ai des défauts que je ne peux pas contourner.Quelle est la bonne façon d'implémenter une classe de ligne réseau
Ma première méthode consistait à créer un StreamReader
appelé _reader
en utilisant TcpClient.GetStream()
comme base, et faire juste un _reader.ReadLine()
. Cela présente l'avantage que le thread d'écoute d'arrière-plan s'arrête automatiquement jusqu'à ce qu'une ligne soit reçue. Le problème est que lorsque je déconnecte et arrête le thread d'écoute (ou l'application quitte simplement), je ne suis pas sûr à quel point il est bon pour la collecte de place etc que le thread avec l'attente ReadLine()
vient d'être tué. Le thread pourrait devenir orphelin et rester en quelque sorte en arrière-plan en train de voler des ressources?
Ma deuxième méthode était de créer un NetworkStream
appelé _reader
basé sur le même TcpClient.GetStream()
et créer une boucle qui vérifie _reader.DataAvailable
et continue
la boucle while si elle est fausse, et par ailleurs pousser les octets dans un StringBuilder qui est instantanément vérifiée \r\n
et extrait toutes les lignes entières. Cela donne le même effet que la ReadLine sur la récupération de données, mais je n'aime pas la boucle constante _reader.DataAvailable
. Sur mon processeur Core i5, il ne prend pas de CPU mais sur mon ordinateur portable i9 beaucoup plus puissant il vole un CPU virtuel en permanence. "Résout" cela, mais semble être une solution sale, et de nombreux articles sur Internet classent cela comme une odeur de code.
Alors, quelle serait la bonne solution?
J'ai regardé les méthodes asynchrones, mais la documentation de MSDN - et particulièrement l'exemple de code - est pleine de failles et d'erreurs. Je n'ai toujours pas trouvé un bon guide sur la façon de les utiliser. – carlsb3rg
True. Les ressources les plus utiles concernent les applications TCP/IP non gérées.J'ai quelques lignes directrices dans la section 2 de ma [FAQ] (http://nitoprograms.blogspot.com/2009/04/tcpip-net-sockets-faq.html), mais ce n'est pas du matériel de niveau tutoriel. –
Je n'annule jamais le fil. C'est un thread d'arrière-plan qui meurt automagiquement lorsque l'application se ferme. La boucle d'écoute est 'while (tcpClient.Connected) {...}'. Si j'utilise '.ReadLine()' alors il n'y a aucun moyen de forcer l'exécution du programme à continuer à la prochaine 'while' vérifier et terminer la boucle gracieusement. C'est pourquoi je veux utiliser la méthode NetworkStream car je peux boucler en continu tant que les données ne sont pas disponibles et quitter gracieusement si nécessaire. J'ai aimé votre FAQ thugh. Vous devriez contourner les bits qui sont pour une entrée futre FAQ. – carlsb3rg