Est-il sûr à lire et à écrire à un port série dans le même temps par l'intermédiaire de différents threads?
Est-il sûr à lire et à écrire à un port série dans le même temps par l'intermédiaire de différents threads (lire le thread et d'une écriture thread)? Serait-il nécessaire d'ajouter de verrouillage autour de la lecture/écriture dans chaque thread?
OriginalL'auteur Taylor Leese | 2009-09-28
Vous devez vous connecter pour publier un commentaire.
À partir de la documentation de SerialPort:
Depuis de Lecture et d'Écriture ne sont pas statiques, ils ne seraient pas thread-safe. C'est une très mauvaise idée, en tout cas, depuis la classe SerialPort maintient des tampons internes pour vous.
Vous aurez besoin de synchroniser vos e/S pour le port série.
Oui: il devrait être d'accord, à condition que votre lecteur de fil n'écrit jamais, et votre thread d'écriture ne lit jamais, MAIS c'est un détail d'implémentation, et de la documentation n'est pas spécialement dire que c'est autorisé, donc en théorie, cela pourrait changer dans une future version de .NET. Aussi, je ne garantis pas que c'est le comportement sur d'autres plateformes, comme si vous utilisez SerialPort sur la CF. Je ne le ferais pas, personnellement, depuis l'API, la documentation n'est pas expressément autorisé.
L'on a accepté la réponse est fausse. La MSDN est plein de détails manquants. Le fait que la sécurité des threads n'est pas explicitement mentionné dans la MSDN peut simplement dire que l'équipe de documentation de Microsoft oublié de le mentionner. Vous devriez avoir regardé dans le code source avant d'écrire votre réponse. En interne SerialPort utilise une classe SerialStream qui utilise l'API CreateFile("\\.\COM1") pour ouvrir une bidirectionnel port COM. Les données sont lues avec le ReadFile() et écrit avec le WriteFile() de l'API. Ainsi, le SerialPort est certainement thread-safe si un seul thread écrit et l'autre thread ne lit.
OriginalL'auteur Reed Copsey
La lecture et l'écriture sur le port série "en même temps" à partir de différents threads est un moyen standard pour gérer port série de communication: un thread gère la lecture et l'une des poignées de l'écriture. Acceptable.
Il y a un numéro de série des appareils qui envoient des données de manière asynchrone à l'ordinateur hôte, tout en permettant de commandes pour être envoyé à l'appareil lui-même: les périphériques tels que les scanners de codes à barres, l'étiquette de scanneurs et appareils photo.
Problèmes?
Problèmes surviennent lorsque vous essayez de synchroniser votre communication vers et depuis l'appareil.
Par exemple, vous voulez écrire une commande, puis immédiatement à la lecture de toute réponse. Eh bien, dans ce cas il faudrait suspendre le thread de lecture et manuellement lire toutes les données du port série après avoir écrit la commande. Après que la commande a été traitée, le thread de lecture peut démarrer à nouveau.
Résumé
En général par le biais d', je vous suggère d'avoir un seul fil supplémentaire que tous les processus de la lecture des données du port et déclenche des événements, tels que
DataReceived
et d'effectuer toutes vos écritures à partir de votre thread principal.Yip. Généralement c'est l'approche que j'ai trouvé pour être acceptable. Mais comme je l'ai trouvé, le problème se situe vraiment dans la synchronisation du lit et écrit et un garçon qui peut être un carrément de la douleur 🙂
OriginalL'auteur Mike J
J'attendrais le cas que vous décrivez, avec 1 Lisez et 1 Écrire fil pour être sûr.
La Lecture et Écriture de chaînes sur le matériel sont conçus pour être utilisés en full duplex, et le logiciel doit être conçu de manière à soutenir que trop.
Et bien que je ne pouvais pas trouver un énoncé explicite à ce sujet, l'exemple de la Page MSDN pour le SerialPort également écrit à partir du thread principal pendant qu'il lit sur l'autre. Sans verrouillage.
OriginalL'auteur Henk Holterman