2010-08-06 6 views
1

J'écris une classe qui traiterait toutes les communications série avec un périphérique externe (c'est-à-dire lire et écrire). Les données sont transmises à l'ordinateur à 20 Hz, et parfois des données sont également écrites sur l'appareil. La classe enverrait ensuite des données valides via un événement à l'interface utilisateur principale. Je souhaite placer cette classe dans un thread distinct car mon code précédent a provoqué un certain «bégaiement» dans le périphérique car il se trouvait dans le thread d'interface utilisateur principal. Je ne suis pas sûr de savoir comment structurer et implémenter la classe SerialPort avec un thread/background worker parce que je n'ai pas d'expérience dans ce domaine.Comment implémenter SerialPort avec le thread C#?

Est-ce que seul l'événement de données reçues existe dans le thread/background worker? Comment passeriez-vous des données dans et hors du thread/arrière-plan créé?

Tous les conseils ou suggestions seraient grandement appréciés!

Répondre

1

Mon premier conseil est que vous devez penser comme il était la communication réseau (Socket). Les problèmes de threading sont sensiblement les mêmes. En regardant à travers la documentation MSDN ils ont (si je me souviens bien) deux façons différentes de le faire, asynchrone et synchronisation. Personnellement, j'utiliserais l'un des moyens asynchrones.

Vous pouvez également jeter un coup d'œil à la nouvelle bibliothèque de tâches.

Commencez à chercher pour cela et revenir si vous avez d'autres questions =)

également du port série de la bibliothèque msdn avec filetage example c'est à la console, mais de toute façon.

+0

J'ai fait quelques recherches supplémentaires sur le site msdn, et j'ai lu que l'événement DataReceieved est créé sur un thread séparé. Cela signifie-t-il que tout ce qui est géré à l'intérieur de ce gestionnaire d'événements est déjà sur un thread séparé? Est-ce que ce que j'essaie de faire est redondant? – steeppham

+0

Eh bien oui je suppose que c'est ... =) Assurez-vous que pour l'interface utilisateur, vous utilisez BackgroundWorker ou quelque chose de similaire afin de ne pas "bloquer" l'interface utilisateur, c'est là que vous devez utiliser le filetage. Donc, toute la manipulation du port série est dans un thread, dans lequel vous utilisez l'événement. –

0

Vous venez d'implémenter dans un autre thread l'utilisation réelle du SerialPort. Lorsque vient le moment de "notifier" votre interface utilisateur, vous utilisez "BeginInvoke" pour obtenir la gestion de l'interface utilisateur réelle à exécuter dans le thread d'interface utilisateur.

Quelque chose comme:

string s = _port.ReadLine(); 

form.BeginInvoke((MethodInvoker)delegate 
{ 
    _textbox.Text = s; 
}); 
0

Utilisez simplement l'événement DataReceived.

Questions connexes