2008-09-08 15 views
9

J'ai un service WCF qui comprend des composants d'interface utilisateur, ce qui me force à être en mode STA. Comment régler le comportement du service en mode STA?Comment faire un service WCF STA (single-threaded)

Comment régler le comportement du service en mode STA? Le service utilise une référence à un fichier DLL WPF qui ouvre une fenêtre d'interface utilisateur (utilisée comme port de visualisation) pour l'analyse d'image. Lorsque le service tente de créer une instance de cet élément (hérite de la fenêtre), il renvoie une exception:

Le thread appelant doit être un STA

Répondre

0

J'enquête en utilisant l'attribut [STAThread] pour changer le modèle de filetage. par exemple.

[STAThread] 
static void Main() 
{ 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new Host() }; 
     ServiceBase.Run(ServicesToRun); 
} 

Description of the STAThread attribute

Mais je suis confus pourquoi vous utilisez des composants de l'interface utilisateur dans un service Web du tout. Pouvez-vous expliquer un peu plus pourquoi vous essayez de faire cela?

+1

Je sais que le commentaire arrive un peu tard, mais néanmoins - n'utilisez pas cette approche! Fondamentalement, cela entraînera un blocage avec le thread Finalizer, de sorte que la finalisation ne fonctionnera pas, causant des fuites de ressources. Je vais ajouter l'URL avec plus de détails bientôt. – Mihailo

+0

http://stackoverflow.com/questions/2001667/net-windows-service-needs-to-use-stathread – GregC

1

Je fais quelque chose de similaire à vous.

Ma solution consistait à acheminer tous les appels via une file d'attente de threads STA. J'ai utilisé une collection threadsafe du nouveau parallel framework pour mettre en file d'attente les actions que je voulais exécuter sur un thread STA. J'ai ensuite eu X nombre de threads STA qui continuellement vérifié la file d'attente pour de nouvelles actions à exécuter. L'attribut

+1

Et, maintenant, j'utilise simplement un [SynchronizationContext] personnalisé (http://msdn.microsoft. com/fr-fr/magazine/cc163321.aspx # S4) pour cela maintenant. Meilleure solution. – Will

0

ServiceBehaviour vous permet de spécifier le comportement. Dans votre cas pour seul thread vous utiliseriez suivant:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service : IService 
{ 
} 

Vous might want to read about differentInstanceContextMode s pour vous aider à mieux choisir la façon dont vous voulez le service se comporter.

Vous devez également ajouter à votre app.config nouveau comportement de service (ou modifier existant):

<behavior name="wsSingleThreadServiceBehavior"> 
     <serviceThrottling maxConcurrentCalls="1"/> 
    </behavior> 

et dans la configuration de votre comportement dans la même app.config ensemble behaviorConfiguration comme suit:

<service behaviorConfiguration="wsSingleThreadServiceBehavior" name="IService"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsEndpointBinding" name="ConveyancingEndpoint" contract="IService" /> 
    </service> 

Espoir cela vous fait gagner du temps