Est-il prudent de lire et d’écrire sur un port série en même temps via différents threads?

Est-il prudent de lire et d’écrire sur un port série en même temps via différents threads (un thread de lecture et un thread d’écriture)? Serait-il nécessaire d’append un locking autour de la lecture / écriture dans chaque thread?

De la documentation de SerialPort :

Tous les membres statiques publics (partagés dans Visual Basic) de ce type sont thread-safe. Il n’est pas garanti que les membres d’instance soient thread-safe.

Etant donné que Read et Write ne sont pas statiques, ils ne seraient pas threadsafe. En tout état de cause, c’est une très mauvaise idée, car la classe SerialPort conserve pour vous des tampons internes.

Vous devrez synchroniser votre E / S sur votre port série.

Lire et écrire simultanément sur le port série à partir de différents threads est un moyen standard de gérer les communications par port série: un thread gère la lecture et l’autre, l’écriture. Acceptable.

Un certain nombre de périphériques série envoient des données de manière asynchrone à la machine hôte tout en permettant l’envoi de commandes au périphérique lui-même: des périphériques tels que des scanners de codes à barres, des scanners d’étiquettes et des appareils photo.

Problèmes?

Des problèmes surviennent lorsque vous tentez de synchroniser votre communication avec le périphérique.

Par exemple, vous voulez écrire une commande puis relire immédiatement toute réponse. Dans ce cas, vous devez suspendre le fil de lecture et lire manuellement toutes les données du port série après avoir écrit la commande. Une fois la commande traitée, le fil de lecture peut redémarrer.

Résumé

En général, je suggérerais de ne disposer que d’un seul thread supplémentaire qui traite toutes les lectures de données de port et déclenche des événements tels que DataReceived et effectue toutes vos écritures à partir de votre thread principal.

Je m’attendrais à ce que le cas spécifique que vous décrivez, avec les fils 1 Read et 1 Write, soit sûr.

Les canaux de lecture et d’écriture sur le matériel sont conçus pour être utilisés en duplex intégral et le logiciel doit également être conçu pour prendre en charge cette fonction.
Et bien que je n’aie pas pu trouver une déclaration explicite à ce sujet, l’exemple de la page MSDN pour SerialPort écrit également à partir du fil principal alors qu’il lit sur un autre. Sans locking.