Comment faire pour appeler une fonction de parent fil dans .NET?
J'ai un .NET la bibliothèque de la classe contenant une classe avec une méthode qui effectue une opération longue. Quand un client appelle cette méthode, il doit effectuer l'opération longue sur un nouveau fil de discussion afin d'éviter le blocage de l'appelant. Mais une fois la méthode de finitions, il faut exécuter du code sur le thread principal. Dans une application WinForms j'aurais pu utiliser le Système.De Windows.Les formulaires.De contrôle.Invoquer la méthode, mais ce n'est pas mon cas. Alors, comment puis-je y parvenir en C#?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez appeler une fonction sur un thread spécifique à l'aide d'un
System.Windows.Threading.Dispatcher
objet (à partir de la WindowsBase de l'assemblée).Par exemple:
J'ai trouvé une solution simple à ce problème :
Mon COM objet est déclaré comme ceci:
Et dans ma page HTML je l'utilise comme ceci:
Si un thread doit être en mesure d'exécuter un morceau de code (généralement sous la forme d'un délégué) posté par un autre thread, il devra être en attente de ces instructions. Quoi d'autre est votre thread principal en train de faire? Il n'est pas difficile de construire un équivalent de la boucle (en fait, vous auriez un producteur/consommateur de la file d'attente des délégués), mais vous devez être conscient que vous ne pouvez pas interrompre le thread principal et de dire "faites-le maintenant".
Pourquoi est-ce que avez à exécuter dans le thread principal?
Il n'y a pas moyen de faire explicitement code exécuté sur un thread spécifique, (sauf pour le thread qui a été utilisé pour créer des Contrôles d'INTERFACE utilisateur - c'est une exception), mais si vous voulez simplement appeler un code autre que le code lorsqu'un thread se termine, Vous utilisez les délégués.
D'abord déclarer un délégué à la signature de la méthode que vous souhaitez exécuter sur le nouveau thread...
Ensuite dans votre code, créez une instance du délégué, l'appeler à l'aide BeginInvoke (en passant les paramètres dont il a besoin) et de PASSER d'une fonction de rappel délégué (OnChkPrimeDone)
Quand c'est fait, il va appeler la fonction de rappel (OnChkPrimeDone)
Si vous l'avez explicitement besoin pour exécuter cette fonction de rappel sur le thread qui a été utilisé pour créer la COM Active-X de l'objet, puis vérifier l' .Net Code Managé wrapper variable qui contient une référence à cet objet... Si il a une méthode appelée InvokeRequired(), puis, dans votre fonction de rappel, test de la boolean valeur de retour de cette méthode.
Si il a InvokeRequired() méthode renvoie true, active-X de l'objet également d'exposer un "BeginInvoke()" la Méthode. Ensuite, Créez un AUTRE Délégué, rempli avec la même fonction, et appeler BeginInvoke
sur la population Active-X de l'Objet, en lui passant ce nouveau délégué... Il va alors s'exécuter sur le même thread que a été utilisé pour créer teh Active-X de l'Objet
Un thread ne peut pas exécuter des trucs sur un autre thread. Le plus proche que vous pouvez obtenir est de mettre un délégué sur une file d'attente pour l'autre thread à exécuter, mais qui suppose que l'autre thread est en train de coopérer à ce sujet.
Dans une application WinForms, la boucle principale ressemble pour de tels messages en file d'attente sur chaque itération de boucle.
Si vous avez juste besoin de communiquer à la finition de la thread de travail, vous pouvez utiliser par exemple un drapeau variabe. Si le thread principal doit être en mesure d'attendre de la cessation d'emploi, l'utilisation d'un sémaphore ou variable de condition (moniteur).
Voici mon scénario exact: j'ai un .NET de la bibliothèque de classes exposé comme un objet COM (à l'aide de regasm.exe). L'objet COM contient une méthode qui s'exécute une application externe (à l'aide de Processus.Démarrer). L'objet COM est utilisé dans Internet Explorer. Donc ma page web s'exécute l'application externe et j'ai besoin de trouver un moyen de passer le ExitCode à la page web.
Au début, je n'avais pas démarrer l'application externe sur un nouveau thread et simplement attendu pour l'utilisateur de fermer l'application, puis de ma fonction a retourné la ExitCode à l'appelant. Mais alors que la demande était en cours d'exécution IE était pas sensible. J'ai donc décidé de lancer l'application dans un nouveau thread, mais maintenant je ne peux plus retourner le ExitCode.
L'objet COM est créé avec:
new ActiveXObject
instruction et, malheureusement, le javascript n'est pas de l'événement, s'enfonce si je ne peux pas écrire un événement dans le C# qui est déclenché lorsque l'application se ferme.