c # .Net 4.5 Communication entre les threads

Je construis une application où il est possible de surveiller du matériel MCU (lectures de capteurs, etc.) en temps réel. Pour la communication, j'utilise un bus CAN.

Fondamentalement, j'ai 2 fils à partir de maintenant. L'un est le thread principal où l'interface graphique est en cours d'exécution et l'autre gère/surveille la communication entre l'appareil. Donc la chose évidente est que j'ai besoin de passer les données du thread de communication au thread gui. Cependant, quelle devrait être la bonne façon de le faire? Je sais comment renvoyer une donnée au thread appelant quand le thread fils a fini de fonctionner, mais dans ce cas le thread de communication s'exécute tout le temps.

Bien sûr, la logique de communication est représentée par une classe distincte (CANManager).

J'ai quelques idées personnelles, mais j'aimerais savoir quelle est la «bonne» façon de procéder.

Merci d'avance :)

2
Mon idée initiale était simplement de créer une "classe de stockage" qui contiendrait toutes les valeurs nécessaires en tant que propriétés. donc je pourrais mettre à jour ces propriétés de façon asynchrone à partir de mon thread de communication, puis lier ces propriétés à la wpf. :)
ajouté l'auteur xnonamex, source
pourrait être. Comme vous l'avez peut-être deviné, je ne suis pas un spécialiste en oop et C#, car ma chose principale est intégrée c. Mais est-ce que cela peut être une chose? cela semble juste la chose la plus simple si cela fonctionne?
ajouté l'auteur xnonamex, source
veux-tu dire un 'ViewModel'? :)
ajouté l'auteur Dr. ABT, source
Cependant, quelle devrait être la bonne façon de le faire? copie possible de google.com.au/search?q=wpf+invoke+on+main+thread
ajouté l'auteur ta.speot.is, source
Jetez un oeil à la classe BackgroundWorker, où vous pouvez utiliser l'événement 'ProgressChanged': msdn.microsoft.com/en-us/library/… | Comme vous utilisez .NET 4.5, vous pouvez également utiliser la classe Task, qui vous permet de continuer avec le même processus, dès que votre processus fils est terminé: msdn.micros
ajouté l'auteur Kai Hartmann, source

1 Réponses

Généralement dans tout langage de programmation, vous devez considérer une architecture pub-sub pour communiquer à travers les threads. Cela signifie que pour chaque thread A qui souhaite envoyer un message au thread B, vous devez publier un message ou un événement de ce thread dans une file d'attente, pour être consommé par un autre thread quand il est libre. Si vous venez de communication croisée des threads C# de google, vous trouver de nombreux articles à lire.

Plus précisément, dans .NET, le moyen d'invoquer une méthode ou un délégué sur un autre thread (tout) consiste à utiliser SynchronizationContext . Ceci est commun aux Windows Forms et WPF, tandis que wpf a un Dispatcher qui est distinct de ce framework pour invoquer uniquement sur le thread UI.

Il existe de nombreux cadres, bibliothèques, modèles disponibles pour faire ce genre de technique. L'un d'entre eux est la bibliothèque parallèle de tâches . TPL vous permet de créer une tâche ou une tâche et de l'invoquer sur un thread pool, une interface utilisateur, un thread identique ou spécifique. La TPL permet le rassemblement de threads via l'utilisation de Planificateurs . Vous pouvez utiliser les Schedulers intégrés ou créer les vôtres. Les programmeurs utilisent SynchronizationContext en leur cœur pour effectuer le rassemblement de threads.

Un modèle particulièrement intéressant de TPL est la capacité à exécuter un délégué sur un thread, puis à enchaîner plusieurs opérations sur d'autres threads, par ex. à la fin ou en cas d'erreur. Je voudrais regarder dans le Tâche asynchrone de tâche et envisagez de renvoyer Task à partir des méthodes async afin de pouvoir enchaîner sur eux en utilisant ContinueWith .

3
ajouté