2009-02-25 5 views
1

J'écris une application utilisant WCF où les clients s'abonnent à un serveur et ensuite les mises à jour sont repoussées aux clients.Les appels sont-ils synchrones dans WCF?

Les abonnés s'abonnent au serveur en utilisant un DuplexPipeChannel appelant une méthode Subscribe() sur le serveur.

Le serveur gère un abonné List <> et lorsqu'il y a des données à transmettre aux abonnés, il appelle une méthode PushData().

Mon intention est de parcourir la liste des abonnés appelant la méthode push sur chacun d'eux à tour de rôle. Ce que je veux savoir est: Est-ce que l'appel de la méthode push sur mon abonné bloque? Un échec de connectivité ou un retard dans la connexion à l'un des abonnés entraînera-t-il un retard du reste des appels Push (ou pire, un échec)?

Je suis désolé si c'est une question évidente, mais j'ai été la plupart du temps une personne .Net 2.0 jusqu'à présent, donc je sais très peu de choses sur WCF. Mon code WCF est basé sur this tutorial.

Une autre question Si l'on suppose qu'il est synchrone, je suis mieux fraie au large un nouveau thread pour traiter les demandes côté client ou serais-je mieux frayer un nouveau thread pour chaque « push Serverside? »

Répondre

4

Les appels WCF sont synchrones par défaut, bien qu'ils puissent être configurés pour être asynchrones. Voir la réponse de Jarrett ci-dessous. Jetez un oeil here. Chaque message que vous envoyez recevra un résultat, que vous attendiez des données ou non.

L'appel bloquera en fonction de ce que fait votre serveur. Si PushData sur le serveur itère réellement dans la liste des abonnés et envoie un message à chacun, il le fera. Si PushData n'insère que les données et qu'un autre thread gère l'envoi des données aux abonnés, il ne bloquera que pendant que votre serveur insère les données et les renvoie.

Espérons que cela aide.

Éditer: Concernant les threads générateurs côté client vs côté serveur. Du côté serveur. Si les appels d'un client prennent un certain temps, mais si cela prend beaucoup de temps parce que le serveur envoie des appels à d'autres clients dans le même appel, alors quelque chose ne va pas. En fait, je ne créerais pas vraiment de nouveau fil à chaque fois. Créez simplement un modèle producer/consumer sur votre serveur, de sorte que chaque fois qu'un élément de données est mis en file d'attente, le consommateur le récupère. Enfer, vous pouvez même avoir plusieurs consommateurs.

3

Si vous cliquez avec le bouton droit sur la référence de service, vous avez la possibilité de créer des appels asynchrones. (Il y a une case à cocher dans la boîte de dialogue d'installation.) Généralement, je crée des méthodes Async, puis j'écoute un résultat. Bien que ce soit un peu plus de travail, je peux écrire une application beaucoup plus réactive en utilisant des opérations de service asynchrones.

+0

J'ai mis à jour ma réponse pour inclure cette information. +1 –

+0

Je crée le service en code comment puis-je le faire Asynch dans le code? –

Questions connexes