Pourquoi Thread.Sleep () avant SerialPort.Open and Close?

Je remarque des exemples de codes que j’ai lus lors de la fermeture et de l’ouverture de SerialPort où les utilisateurs appendaient Thread.Sleep (1000) avant SerialPort.Open () et Close (). Comme ce qui suit:

Thread.Sleep(1000); serialPort1.Open(); /* some code */ Thread.Sleep(1000); serialPort1.Close(); 

Je ne trouve aucune explication nulle part. Pourquoi les gens bloquent-ils le port série à l’aide de Thread.Sleep avant qu’il ne soit ouvert ou fermé? Est-ce à des fins de chronométrage? Suis-je censé mettre un Thread.Sleep chaque fois que je lis ou que j’écris également sur le port série?

Lorsque vous ouvrez un port, la classe SerialPort lance un nouveau thread sous le capot qui est responsable (via la fonction API Windows de WaitCommEvent) d’attendre l’activité du port série (par exemple, les données arrivées) et de déclencher les événements appropriés à vos gestionnaires. C’est pourquoi des événements tels que DataReceived se produisent réellement sur un thread secondaire.

Lorsque vous fermez le port, l’appel Close () est renvoyé immédiatement, mais le thread secondaire met un certain temps à se désactiver.

Si vous essayez de rouvrir le port trop rapidement après avoir appelé Close et que le thread ne soit pas encore interrompu, l’instance de SerialPort n’est pas dans un état où elle peut établir une nouvelle connexion.

Notez la documentation MSDN pour SerialPort.Close déclare:

La meilleure pratique pour toute application est d’attendre un certain temps après l’appel de la méthode Close avant de tenter d’appeler la méthode Open, car le port peut ne pas être fermé instantanément.

Vous pouvez savoir quand vous avez fermé le port et, avant de l’ouvrir à nouveau, assurez-vous qu’un délai d’attente arbitraire s’est écoulé.

Pas besoin de dormir avant de lire / écrire, bien que quelques bizarreries à garder à l’esprit:

  • Lire peut renvoyer moins d’octets que vous ne le demandez
  • Parfois, l’événement DataReady ne se déclenche pas
  • ReadTimeout peut être bogué

N’oubliez pas que la classe SerialPort dans le .NET BCL s’appuie toujours sur l’API Win32 sous-jacente, et je ne pense pas qu’elle ait suscité beaucoup d’amour de la part de Microsoft depuis la première implémentation.

Pour plus d’informations, voir:

Une seule connexion ouverte peut exister par object SerialPort. La meilleure pratique pour toute application est d’attendre un certain temps après l’appel de la méthode Close avant de tenter d’appeler la méthode Open, car le port peut ne pas être fermé instantanément.

Regardez ce lien .

J’ai réalisé quelques programmes d’E / S série en C # et je ne pense pas que je n’ai jamais ajouté de sumil comme ça. Je n’ai constaté aucun effet néfaste (à condition que mes applications n’essayent jamais d’ouvrir et de fermer le port série rapidement)

Vous ne devriez certainement pas avoir à dormir avant de lire ou d’écrire.