C# Multithreading — Invoquer sans Contrôle

Je suis seulement un peu familier avec le multi-threading et que j'ai lu à ce sujet, mais ne l'ai jamais utilisé en pratique.

J'ai un projet qui utilise un tiers de la bibliothèque que les actions de l'état d'un périphérique d'entrée par le déclenchement des événements. Le problème, c'est la façon dont la bibliothèque est écrit ces événements sont déclenchés par un thread différent.

Ma demande n'a pas besoin d'être multi-thread et j'ai couru dans beaucoup de classiques problèmes de threading (contrôles d'INTERFACE utilisateur se plaindre d'être en interaction avec d'un thread différent, les collections qui sont modifiés comme un morceau de code est une itération sur elle, etc.).

Je veux juste la 3ème partie de la bibliothèque de l'événement pour en revenir à mon thread de l'INTERFACE utilisateur. Plus précisément, je pense que ce qui doit arriver est:

Ma classe reçoit l'événement et le gestionnaire est en cours d'exécution sur un autre thread de l'INTERFACE utilisateur. Je veux détecter cette condition (comme avec InvokeRequired), puis effectuer l'équivalent de BeginInvoke à donner le contrôle de retour pour le thread d'INTERFACE utilisateur. Puis à la bonne notifications peuvent être envoyées sur la hiérarchie de classe et l'ensemble de mes données n'est touché par l'un thread.

Le problème, c'est la classe qui est la réception de ces événements d'entrée n'est pas dérivé de Contrôle et, par conséquent, n'ont pas InvokeRequired ou BeginInvoke. La raison pour cela est que j'ai essayé de séparer proprement de l'INTERFACE utilisateur et la logique sous-jacente. La classe est toujours en cours d'exécution sur le thread de l'INTERFACE utilisateur, il n'a tout simplement pas toute l'INTERFACE utilisateur à l'intérieur de la classe elle-même.

Maintenant que j'ai résolu le problème en les ruinant, que la séparation. Je passe une référence pour le contrôle qui sera d'afficher les données de ma classe et à l'aide de son Appeler des méthodes. Qui semble comme il défait le but entier de se séparer, parce que maintenant la classe sous-jacente a une dépendance directe sur mon INTERFACE spécifique à chaque classe.

Peut-être il y a un moyen pour enregistrer une référence pour le thread qui a couru le constructeur et puis, il y a quelque chose dans le thread de l'espace de noms qui effectue l'Invoquer des commandes?

Est-il un moyen de contourner cela? Mon approche complètement tort?

InformationsquelleAutor colithium | 2009-11-15