Comment puis-je faire un thread d'arrière-plan définie à Thread Unique Appartement?
Je suis entrain de créer un test automatisé application en cours d'exécution. Dans cette partie de l'application, je suis en train de travailler sur une interrogation du serveur. Il fonctionne en permanence de l'interrogation du serveur web de déterminer quand un nouveau système automatisé de test doit être exécuté (pour les soirs automatisé s'exécute de notre application GUI).
Lors de l'interrogation du serveur voit une demande, il télécharge toutes les informations nécessaires, puis exécute l'exécution des tests dans un contexte travailleur. Le problème est qu'une partie de l'essai a OLE, COM, et d'autres appels (par exemple, Clipboard.Clear()
) qui se produisent dans le contexte de thread de travail. Lorsque l'un de ces appels se produit, l'exception suivante se produit:
Thread en cours doit être réglé à thread unique appartement (STA) mode avant OLE appels peuvent être effectués. S'assurer que votre Principale fonction est de s'STAThreadAttribute marqués sur elle.
Comment puis-je marquer un arrière-plan thread thread unique appartement? Le Principal appel dans mon Programme.cs évidemment a déjà cet attribut.
Clipboard.Clear()
n'est pas COM. Il est originaire de l'API Windows.- Presse-papiers utilise COM de négocier des données du presse-papiers et de formats.
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas possible, BGW utilise un pool de threads thread. TP fils sont toujours MTA, il ne peut pas être changé. Vous devez utiliser un Fil, appel SetApartmentState() avant de vous lancer. De plus, ce fil doit pomper une boucle de message, Application d'appel.Run().
Peut-être vous devriez envisager de demander ce code à partir du thread d'INTERFACE utilisateur. Parce que selon toute probabilité, le serveur COM est en cours d'exécution de ses méthodes sur le thread de l'INTERFACE utilisateur de toute façon. Marshaling des appels à partir d'un thread de travail pour le personnel thread qui a créé le serveur COM est automatique, COM prend soin de lui.
Ou de prendre le taureau par les cornes et maréchal de vous-même. Vous pouvez créer votre propre thread STA pour donner le serveur un foyer heureux. Vous trouverez le code dans ce post, assurez-vous de créer l'objet COM dans votre Initialize() remplacer.
BackgroundWorker utilise par défaut un pool de threads thread, mais vous pouvez remplacer ce comportement. Vous devez d'abord définir une coutume SynchronizationContext:
Et remplacer la valeur par défaut SynchronizationContext, comme cela, avant de vous utiliser votre BackgroundWorker:
REMARQUE: cela peut avoir des effets sur les performances sur le reste de votre application, de sorte que vous pouvez limiter les nouveaux Post-mise en œuvre (par exemple en utilisant la état ou d paramètres).
Je ne l'ai pas testé, mais si vous appelez la WinForms Forme, vous devriez être de retour pour le thread d'INTERFACE utilisateur et la plupart des choses, devrait fonctionner à nouveau.
Vous réglez normalement par définition attributre
[STAThread()]
sur le point d'entrée (par exemple, Statique Principal).J'ai utilisé +Conrad de Mouiller son idée et il fonctionnait très bien!
Il y a un petit problème avec ce code, vous devez fermer le "cette.Invoke....." comme avec un });
Voici Conrad de Wet code avec ce correctif: