2009-09-16 5 views

Répondre

0

Non, car vous ne voudrez jamais faire cela. Qu'est-ce que vous essayez vraiment de réaliser?

EDIT

Sur la base de plus d'informations à venir dans, voici ce que je pense.

Si vous voulez simplement un "état collant" par requête, vous devez utiliser l'état sur l'instance et utiliser InstanceContextMode.PerCall, conformément à la réponse de marc_s.

Si vous avez besoin d'un état pour le stockage local-thread pour votre appel, vous pouvez utiliser ICallContextInitializer comme un moyen de placer l'état sur le thread sur lequel WCF choisit d'appeler votre méthode (et nettoyer l'état du thread quand l'appel se termine).

Mais vous ne devriez pas vous soucier de "quel fil". WCF va gérer cela avec un pool de threads en votre nom.

+0

Pourriez-vous expliquer un peu plus? –

+0

L'idée est de partager des sessions db, des informations d'identification, etc. dans une requête en les stockant dans ThreadContext. Cela nous aidera à faire des reculs, etc. – Nazgul

+0

Bien sûr, vous pouvez - c'est même la meilleure pratique recommandée! Le ServiceHost a un pool de threads de travail pour ce but précis –

6

Oui, vous pouvez le faire - c'est ce qu'on appelle la gestion "par appel" des demandes. Le ServiceHost créera une nouvelle instance de votre classe de service pour chaque demande entrant pour gérer cette demande.

Pour ce faire, vous devez définir votre classe de service (l'une implémentation de l'interface de service) pour être « Percall » - vous faites cela en appliquant un attribut de votre classe de service:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService : IYourService 
{ 
... 
} 

Marc

+0

Cela va créer une nouvelle instance de service par appel, mais ne génère pas un nouveau thread par appel. – Nazgul

+0

mais il affectera la nouvelle instance de service à un thread de travail pour gérer la requête ...... –

+1

Je ne pense pas que vous pouvez faire plus que cela. Je ne connais aucun paramètre dans WCF pour créer spécifiquement un nouveau fil pour chaque demande. Et pourquoi voudriez-vous vraiment ?? Créer un thread à part entière est une opération assez coûteuse - pourquoi ne pas utiliser le pool de threads de travail déjà existant? –

3

dépend de ce que vous voulez exactement, mais le comportement de service suivant résoudrons:

ServiceBehavior: 
ConcurrencyMode=ConcurrencyMode.Multiple 
InstanceContextMode=InstanceContextMode.Single 

Votre classe sera un singleton, mais tous les appels aux méthodes se déroulera dans un SEPAR mangé le fil. Si vous avez besoin de synchronisation, vous devez le faire manuellement.

N'oubliez pas non plus de vous pencher sur la limitation pour être conscient des problèmes de performances potentiels.

Questions connexes