4 votes

VSTO Fondateur de fil avec STA et COM

Je construis un complément VSTO : j'ai besoin d'exécuter un thread en arrière-plan, mais ce thread doit accéder à des composants COM (j'ai implémenté IMessageFilter pour rendre cette messagerie aussi sûre que possible). Tous les threads qui accèdent à OLE ou COM doivent être STA je crois ; donc, BackgroundWorker est exclu.

Je suis heureux d'utiliser le thread normal et de définir ApartmentState sur STA, mais j'ai aussi besoin de savoir quand ce thread est terminé pour pouvoir mettre à jour certaines choses de l'interface utilisateur. Je ne veux pas Join() car cela bloquera l'interface utilisateur (c'est toute la raison pour laquelle j'utilise des threads !).

Est-il préférable de déclencher une sorte d'événement à la fin de ma méthode threadée, et de faire les choses terminées nécessaires à l'événement ?

OU

Est-il préférable de sonder

   while(!_threadFinishedStarting)
   {
        Application.DoEvents();
        Thread.Sleep(100);
   }

Comme mentionné ici: C#.net - Comment alerter le programme que le thread est terminé (événement basé sur l'ensemble) ?

Merci beaucoup

3voto

Hans Passant Points 475940

Vous pouvez appeler Thread.SetApartmentState() pour sélectionner un STA avant de démarrer le thread. Vous devez également pomper une boucle de messages, une exigence pour les threads STA. Cela tend à être difficile et est souvent ignoré, vous savez que vous en avez besoin si votre code se bloque ou si votre IMessageFilter se plaint.

Méfiez-vous de l'autre exigence, un STA est seulement efficace lorsque vous créez aussi l'objet que vous voulez utiliser sur ce même thread. Cela tend à poser problème dans un complément VSTO, vous voulez normalement utiliser un objet fourni par le modèle objet Office. Vous ne pouvez pas choisir où cet objet a été créé.

Si c'est exact du tout alors vous n'êtes pas en avance en créant votre propre thread STA puisque les appels sont quand même marshalés. Dans ce cas, un BGW est tout à fait acceptable puisque vous ne pouvez pas aller de l'avant de toute façon, l'appel est marshalé dans les deux cas. Il n'y a pas de déjeuner gratuit pour la sécurité des threads.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X