C#: Comment forcer “l'appel” une méthode dans le thread principal par la signalisation d'une certaine façon à partir d'un autre thread
Désolé pour la longueur du titre, je ne sais pas encore à la manière sur la façon d'exprimer la question
Je suis en utilisant une bibliothèque d'exécuter une fonction de rappel, dans un contexte différent du thread principal (est une Bibliothèque C), j'ai créé la fonction de rappel en C# et quand est appelée, je voudrais juste souligner un événement.
Cependant, parce que je ne sais pas ce qui va être à l'intérieur de l'événement, je voudrais trouver un moyen d'invoquer la méthode sans le problème de serrures et ainsi de suite (sinon, le tiers utilisateur aura à gérer ce à l'intérieur de l'événement, très laid)
Il n'existe aucun moyen pour ce faire?
Je peux être totalement sur la mauvaise voie, mais je suis en train de réfléchir winforms façon de traiter les différents threads (l' .Invoquer chose)
Sinon, je peux envoyer un message à la boucle de message de la fenêtre, mais je ne sais pas beaucoup au sujet de la transmission de message et si je peux envoyer "personnalisé" des messages comme cela
Exemple:
private uint lgLcdOnConfigureCB(int connection, System.IntPtr pContext)
{
OnConfigure(EventArgs.Empty);
return 0U;
}
cette callback est appelée à partir d'un autre programme que je n'ai pas le contrôle, je voudrais courir OnConfigure méthode dans le thread principal (celui qui s'occupe de mon winform), comment faire?
Ou en d'autres termes, je voudrais courir OnConfigure sans la nécessité de la réflexion sur les verrous
Edit 1:
J'ai un problème avec cette exception:
CallbackOnCollectedDelegate récupéré
Message: Rappel exécuter des délégués 'G19dotNet!G19dotNet.LgLcd+lgLcdOnSoftButtonsCB::Invoke " collectées dans GarbageCollector. Cours de code non managé des délégués doit être assurée ne sera jamais supprimé jusqu'à ce que vous êtes sûr qu'ils ne seront jamais appelés
Edit 2:
Problème résolu par moi-même, grâce à Stackoverflow qui m'aide toujours!
Pour une référence future: La définition d'un délégué comme un pointeur de fonction
- S'il vous plaît poster un exemple de code de ce que vous faites.
- Vérifier la question, j'ai ajouté un exemple de code
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez WinForms et vous souhaitez exécuter quelque chose sur le thread de l'INTERFACE utilisateur, vous devez appeler soit
Invoke
ouBeginInvoke
sur certaines de contrôle (que ce soit unButton
ou unForm
ou quoi que ce soit) qui a été créé sur ce thread. Vous aurez besoin d'une référence pour ce faire.Par exemple, avec votre code et en supposant que vous avez une référence à un formulaire appelé
form
:Avant l'appel de la 3e partie de la fonction, obtenir une référence à l'expéditeur.CurrentDispatcher. Dans la fonction de rappel, l'utilisation de répartiteur.Invoquer.
Ce que vous vous retrouvez avec la volonté de ressembler à quelque chose comme ceci:
Dispatcher.CurrentDispatcher
ne retourne l'instance lors de la que l'appel est exécuté sur le thread de l'INTERFACE utilisateur. Pour l'utiliser, vous devrez récupérer et de stocker la valeur deDispatcher.CurrentDispatcher
dans le code d'exécution sur le thread d'INTERFACE utilisateur. C'est beaucoup plus simple d'utiliser le bon mécanisme de synchronisation des threads,Control.Invoke
etControl.BeginInvoke
.Il existe un modèle pour ce qui est appelé Basé sur des événements du Modèle Asynchrone. L'article lié est un excellent aperçu sur la façon de l'utiliser. Le AsyncOperation classe est la clé de ce modèle.
Ce modèle pourrait ne pas s'adapter parfaitement avec votre problème que vous essayez de résoudre, mais il peut vous donner un certain éclairage sur le problème.