2010-07-01 4 views
1

Iam Essayer de créer une fenêtre WPF dans un Workflow Service Com mais iam obtenir l'erreur suivante:Windows Workflow Foundation avec Windows Presentation Foundation

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: The calling thread must be STA, because many UI components require this. 
    at System.Windows.Input.InputManager..ctor() 
    at System.Windows.Input.InputManager.GetCurrentInputManagerImpl() 
    at System.Windows.Input.InputManager.get_Current() 
    at System.Windows.Input.KeyboardNavigation..ctor() 
    at System.Windows.FrameworkElement.FrameworkServices..ctor() 
    at System.Windows.FrameworkElement.EnsureFrameworkServices() 
    at System.Windows.FrameworkElement..ctor() 
    at System.Windows.Controls.Control..ctor() 
    at System.Windows.Window..ctor() 
    at PACIExpress.SelectLanguage..ctor() 

quelqu'un peut-il me aider s'il vous plaît?

Répondre

2

Les états d'exception le problème exactement:

System.InvalidOperationException: The calling thread must be STA, because many UI components require this.

tout d'abord si un « Workflow Service Com » est tout comme un WCF ou un service Web, ce n'est pas une application de bureau qui peut avoir une interface utilisateur.

De toute façon, votre application doit être STA.

La différence entre MTA et STA:

Could you explain STA and MTA?

infos sur WPF et STA: http://msdn.microsoft.com/en-gb/magazine/cc163328.aspx

Et si vous avez une méthode de point d'entrée, vous voulez utiliser l'attribut STAThread, voir ici pour Plus d'informations:

http://blogs.msdn.com/b/jfoscoding/archive/2005/04/07/406341.aspx http://msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx

Hope that helps!

2

La réponse de Kieren explique l'essence du problème, à savoir que le thread Workflow Foundation est un thread MTA alors que WPF nécessite des threads STA. La réponse de Kieren n'explique pas comment résoudre le problème.

Chaque fois que j'ai besoin d'accéder au contenu WPF à partir d'un thread MTA, je crée un thread STA avec lequel accéder au contenu. Je l'ai utilisé deux solutions pour cela, tous deux ont bien fonctionné:

Pooled STA threads

Lorsque des objets WPF ne ont pas besoin d'exister au-delà de l'appel en cours de méthode, j'utilise une classe STAThreadPool j'ai écrit . STAThreadPool implémente les fonctionnalités de base de System.Threading.ThreadPool, mais crée ses threads STA au lieu de MTA. Il a également une méthode RunOnSTAThread qui met en file d'attente un élément de travail utilisateur, puis attend que cet élément soit terminé.

dédiés threads STA

Cette solution est a plus frais généraux, mais est nécessaire en tout temps des objets WPF peuvent exister pour les appels de méthode multiples. Encore une fois il y a une méthode « RunOnSTAThread », qui dans ce cas est mis en œuvre par:

  1. Si le thread courant est STA, juste exécuter l'action
  2. Regardez dans le dictionnaire pour voir s'il y a un thread STA pour ce thread MTA (doit verrouiller le dictionnaire).
  3. Si aucun thread STA n'a été trouvé: Créez un thread STA et ajoutez-le au dictionnaire.
  4. Stocker l'action dans le thread STA, le signal le thread STA à exécuter, et attendez qu'il complète

Chaque thread STA exécute une boucle qui fait cela:

  1. Si correspondant thread MTA n'est pas actif, quitter
  2. Attendez le signal que l'action est prête à s'exécuter, avec un délai de 10s. Si délai d'attente, passez à l'étape 1
  3. Exécuter une action
  4. signal que l'action est terminée
  5. Passez à l'étape 1

Cette solution est en fait moins de code d'un bien écrit STAThreadPool, mais peut-être moins efficace s'il y a beaucoup de threads.

Questions connexes