2010-04-06 16 views
4

L'utilisation d'un .NET TcpClient si j'ai appelé un BeginRead() asynchrone sur le flux réseau associé puis-je toujours appeler Write() sur ce flux sur un autre thread?Est-ce que TcpClient BeginRead/Send est sûr?

Ou dois-je lock() le TcpClient dans le code qui est appelé à partir du BeginRead et le code qui fait l'envoi?

Aussi, si je ferme la TcpClient avec:

client.GetStream().Close(); 
client.Close(); 

Dois-je lock() sur le TcpClient ainsi?

Répondre

8

lecture/écriture des parties du TcpClient sont thread-safe, comme expliqué dans la documentation de la NetworkStream classe (ce qui est ce que le TcpClient utilise pour son IO réelle):

lecture et d'écriture peuvent être effectuée simultanément sur une instance de la classe NetworkStream sans avoir besoin de synchronisation. Tant qu'il y a un fil unique, pour les opérations d'écriture et une fil unique pour les opérations de lecture, n'y aura pas de fils interférences croisées entre lecture et d'écriture et pas de synchronisation est nécessaire.

à voir avec la fermeture, si vous fermez la TcpClient sur un fil, mais essayez donc de lire/écrire en utilisant sur un autre fil après sa fermeture, une exception sera levée. Vous pouvez soit synchroniser les threads avant de les fermer afin de les empêcher d'utiliser le TcpClient, soit attraper et gérer l'exception (par exemple, vous pouvez quitter la boucle d'exécution du thread).

+0

Merci j'ai complètement raté cela dans MSDN mon mauvais - je m'excuse. Sur la fin, je suis attraper et gérer l'exception, mais je ne savais pas si c'était douteux alors merci de clarifier c'est ok car ce n'est pas documenté autant que je sache. – iam

+0

Ouais, il est tout à fait normal qu'il lance une exception si vous essayez d'écrire/lire depuis un TcpClient qui a été fermé. Vous verrez cela à travers toutes les API de socket .NET. – Kazar