86 votes

Comment correctement et complètement fermer / réinitialiser une connexion TcpClient?

Quelle est la bonne manière de la fermer ou de réinitialiser un TcpClient de connexion? Nous avons un logiciel qui communique avec le matériel mais parfois, quelque chose va mal et nous ne sommes plus à communiquer avec lui, jusqu'à ce que nous redémarrer le logiciel.

J'ai essayé de forcer TcpClient.Close() et de même paramètre à null, mais qui ne fonctionne pas. Seul un redémarrage complet du fonctionnement d'un logiciel.

Des Suggestions?


Je ne peux pas utiliser le mot clé using parce que TpcClient n'est définie que dans un seul endroit, mais il a utilisé tout au long de la bibliothèque. (Et il n'y a qu'une seule connexion à un moment donné)

C'est une bibliothèque qui gère les communications. Le logiciel lui-même pouvez appeler la ResetConnection() la méthode de la classe de Contrôleur (qui représente le matériel).

Il ressemble actuellement

if (tcpClient != null)
{
    tcpClient.Close();
    tcpClient = null;
}

Maintenant de ce que j'ai lu ici que je devrais utiliser tcpClient.Dispose() au lieu de "= null"

Je vais vous donner un essai et voir si cela fait une différence.

100voto

SoMoS Points 7082

Vous devez fermer le flux avant de fermer la connexion:

 tcpClient.GetStream().Close();
tcpClient.Close();
 

La fermeture du client ne ferme pas le flux.

22voto

Michał Ziober Points 5787

Utilisez le mot: using . Une bonne habitude de programmation.

 using (TcpClient tcpClient = new TcpClient())
{
     //operations
     tcpClient.Close();
}
 

8voto

jyoung Points 2598

À l’exception d’une journalisation interne, Fermer == Éliminer.

Dispose les appels tcpClient.Client.Shutdown (SocketShutdown.Both), mais les erreurs sont mangées. Peut-être que si vous l'appelez directement, vous pouvez obtenir des informations utiles sur les exceptions.

7voto

Justin Tanner Points 5437

Ferme une connexion de socket et permet de réutiliser le socket:

 tcpClient.Client.Disconnect(false);
 

1voto

chakrit Points 29562

Avez-vous essayé d'appeler explicitement TcpClient.Dispose () ?

Et êtes-vous sûr d'avoir TcpClient.Close () et TcpClient.Dispose () - TOUTES les connexions?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X