Comment partager des données entre les différents threads En C# à l'aide de l'AOP?
Comment partager des données entre les différents threads En C# sans utiliser les variables statiques?
Peut-on créer un tel mécanisme à l'aide de l'attribut?
Aspect volonté de la programmation orientée aider dans de tels cas?
Pour réaliser ce tous les différents fils devrait fonctionner sur un seul objet?
- Vous pouvez accéder à n'importe quelle variable dans la portée à partir d'un thread. par exemple, 2 threads peuvent appeler la même fonction et l'accès des membres de l'instance/variables statiques. Le partage est trivial, la synchronisation de l'accès aux variables entre plusieurs threads est la plus diff tâche.
- Nous essayons de lire la instance de l'objet dans un thread dans un autre thread, et nous avons une restriction à maintenir global/variable statique, est-il une bonne idée pour réaliser cela?
- Vous n'avez pas accès fils en tant que tel. Plutôt que vous d'accéder à des objets que les threads peuvent voir. Si le code s'exécute dans un thread peut accéder à une instance d'objet, données statiques ou il peut la modifier. Si un autre thread peut voir que l'instance de données statiques ou alors vous avez communiquées entre les deux threads.
- Je crois que nous sommes tous pas tout à fait répondre à votre question. Que diriez-vous poster quelques extraits de votre code. Montrez-nous comment vous l'avez obtenu. Je pense que la réponse est en fait beaucoup plus simple que vous avez peur, mais il serait beaucoup plus facile à expliquer dans le contexte de votre propre application.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez passer un objet en argument de la
Thread.Démarrer
et de l'utiliser comme stockage de données entre le fil et le thread d'initialisation.Vous pouvez aussi accéder directement (avec le verrouillage de cours) de vos données membres, si vous avez commencé le thread à l'aide de l'exemple de la forme de la
ThreadStart
délégué.Vous ne pouvez pas utiliser des attributs pour créer de données partagées entre les threads. Vous pouvez utiliser l'attribut instances attaché à votre classe de stockage de données, mais je ne vois pas en quoi c'est mieux que d'utiliser statique de l'instance ou de membres de données.
Vous ne pouvez pas battre la simplicité d'un verrouillée file d'attente de messages. Je dirais de ne pas perdre votre temps avec quelque chose de plus complexe.
Lire sur le de verrouillage déclaration.
verrouillage
MODIFIER
Voici un exemple de Microsoft File d'attente objet enveloppé de sorte que toutes les actions contre il sont thread-safe.
EDIT 2
J'espère que cet exemple permet.
Rappelez-vous ceci est os à nu.
L'utilisation de ces idées de base vous pouvez exploiter la puissance de threads.
volatile
n'est pas thread-safe. Dans le cas où c'est un type simplebool
il pourrait être thread-safe sur certains processeurs, mais le mot clé volatile garantit seulement que le compilateur ne pas réorganiser les instructions. Si _KeepWorking qui s'est passé à quelque chose de plus grand (qui n'est pas un registre de la taille de l'objet), il pourrait être endommagé avec 2 fils de l'écriture en même temps. Probablement le meilleur, pour envelopper dans une serrure() { }Interlocked.Increment
. Dans GetState il peut être jeté parce que...Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types.
//C# spec (Parce que le C# comme Java est compilé par JIT il n'est pas de la responsabilité du programmeur d'application à barboter dans le processeur de détails - c'est le JIT er qui a pour faciliter ces garanties pour tout ce matériel, il a été fait pour l'.)Regardez l'exemple de code suivant:
Dans ce cas, la classe thread
MyWorker
a une variablestate
. Nous l'initialiser avec la même objet. Maintenant, vous pouvez voir que les deux travailleurs d'accéder à la même SharedData objet. Les modifications apportées par un travailleur sont visibles pour les autres.Vous avez quelques questions en suspens. Comment travailleur 2 savoir quand des modifications ont été apportées par le travailleur 1 et vice-versa? Comment pouvez-vous prévenir les conflits de modifications? Peut-être lire: ce tutoriel.
Lorsque vous démarrez un fil que vous êtes l'exécution d'une méthode de certaines classe choisie. Tous les attributs de cette classe sont visibles.
Votre fil est désormais dans le doWork() la méthode et pouvez voir toutes les atrributs de myWorker, qui peuvent eux-mêmes être d'autres objets. Maintenant, vous avez juste besoin d'être prudent afin de traiter les cas d'avoir plusieurs threads toutes les frapper ces attributs en même temps.