Est WCF ClientBase thread-safe?
J'ai mis en œuvre ClientBase à utiliser WCF pour se connecter à un service. Je suis ensuite l'appel d'une méthode sur le canal pour communiquer avec le service.
base.Channel.CalculateSomething();
Est cet appel thread-safe ou devrais-je verrouiller autour d'elle lors de l'exécution de plusieurs threads?
Grâce
Vous devez vous connecter pour publier un commentaire.
Le suivi de commentaires sur les réponses ici m'avait incertain, donc j'ai fait un peu plus de creuser. Voici quelques preuves solides que
ClientBase<T>
est thread-safe - ce blog explique comment créer un service WCF effectuer correctement en présence de un seul client du proxy utilisé par plusieurs threads simultanément (les caractères gras italiques dans le texte original):Aussi, la preuve dans ce post semble contredire de Brian supplémentaires remarque que WCF sérialise tout multi-thread demandes. Le post montre de multiples demandes à partir d'un seul client qui exécute simultanément - si
ConcurrencyMode.Multiple
etInstanceContextMode.PerCall
sont utilisés.Il y a plus de discussion ici concernant l'incidence sur les performances de cette approche ainsi que quelques solutions de rechange.
Oui, il n'est pas thread-safe. Cependant, vous devez savoir que WCF automatiquement sérialiser l'exécution de
CalculateSomething
lorsqu'il est appelé à partir de plus d'un thread à l'aide de la mêmeClientBase
instance. Donc, si vous vous attendiez àCalculateSomething
pour s'exécuter simultanément alors vous devrez revoir votre conception. Jetez un oeil à cette réponse pour une approche à la création d'une API asynchrone pour laCalculateSomething
méthode.Oui l'appel de la méthode sur le canal est thread-safe (à partir du point de vue du client - point de vue du service dépend du service de la mise en œuvre). Vous pouvez appeler cette méthode à partir de plusieurs threads en parallèle. Même autogenerating proxy vous propose de créer des méthodes pour asynchronnous appels.
ClientBase
n'est pas thread-safe, mais appeler le service est (ou peut être d'un bug dans la documentation - qui n'est pas si rare). Tout d'abord, vous pouvez faire un appel sans base de client - vous avez juste besoin d'un canal. Je n'ai pas de preuve. Je crois tout simplement que l'appel de service à distance n'a pas besoin de stocker n'importe quel mondiale de données partagée, sinon tout côté client de la WCF serait terriblement mal conçu.HttpWebRequest
instance pour chaque appel. Je crois fermement que faire des appels est thread-safe, parce que chaque appel doit être traité dans l'isolement: il y a peut être des données partagées, par exemple le contexte de la sécurité, mais j'espère que c'est géré. Changer quoi que ce soit surClientBase
ne sont pas thread-safe - d'autre part, si je me souviens correctement, certaines modifications peuvent être effectuées uniquement avant de procéder à un premier appel.À Qui De Droit.
WCF Client de base peut être thread-safe, au moins dans cette configuration. Je n'ai pas essayé d'autres configurations.
Service:
Client:
Et résultat: