J'ai un service Windows qui prend le nom d'un tas de fichiers et effectue des opérations sur eux (Zip / Unzip, Mise à jour de DB, etc.). Les opérations peuvent prendre du temps en fonction de la taille et du nombre de fichiers envoyés au service. P>
(1) Le module qui envoie une demande à ce service attend jusqu'à ce que les fichiers soient traités. Je veux savoir s'il existe un moyen de fournir un rappel dans le service qui informera le module d'appel lors de la fin du traitement des fichiers. Veuillez noter que plusieurs modules peuvent appeler le service à la fois pour traiter les fichiers afin que le service devra fournir une sorte de tâche que je suppose. P>
(2) Si une méthode de service est appelée et est en cours d'exécution et qu'un autre appel est effectué sur le même service, comment cet appel va-t-il être traité (je pense qu'il n'y a qu'un seul thread associé au service). J'ai vu que lorsque le service prend du temps dans le traitement d'une méthode, les threads associés au service commencent à augmenter. P>
3 Réponses :
WCF propose en effet des liaisons en duplex qui vous permettent de spécifier un contrat de rappel, de sorte que le service puisse rappeler au client appelant pour notifier. P>
Cependant, à mon avis, ce mécanisme est plutôt flakeux et pas vraiment recommandé. p>
Dans un tel cas, lorsque l'appel provoque une opération de course assez longue, je ferais quelque chose comme ceci: p>
Si vous voulez coller aux liaisons HTTP / NETTCP, je voudrais: p>
Donc, dans votre cas, vous pouvez déposer la demande pour zip certains fichiers. Le service ira et ferait son travail et stockerait la fermeture à glissière résultante dans un emplacement temporaire. Ensuite, plus tard, le client peut vérifier si le zip est prêt, et si oui, récupérez-le. P>
Cela fonctionne encore mieux sur une file d'attente de messagerie (MSMQ) qui est présent dans chaque machine de serveur Windows (mais pas beaucoup de gens semblent le savoir ou l'utiliser): P>
Vérifiez comment effectuer tout cela efficacement en lisant l'excellent article MSDN Foudnations : Construisez un service de réponse WCF de la file d'attente - hautement recommandé! P>
Un système basé sur la file d'attente de messages a tendance à être beaucoup plus stable et moins tendu d'erreur d'un système basé sur le contrat en duplex / callback, à mon avis. P>
Je ne peux pas utiliser MSMQ car ce service Windows est exécuté sur le système de l'utilisateur (XP, Vista, 7) et fait partie du produit à télécharger par l'utilisateur. Donc, un getStatus () est la voie à suivre, je suppose. Vous vous demandez comment complexez-vous avec plusieurs commandes exécutant en même temps.
@ A9S6: WCF crée une nouvelle instance de service pour chaque appel - il n'y a donc vraiment aucun problème avec plusieurs demandes en même temps - chacune a sa propre instance de classe de service isolée.
Voulez-vous dire qu'une nouvelle instance de la classe de services (service de service héritée) est créée sur chaque appel? Je pensais que cela n'était arrivé qu'avec des services Web et non des services Windows. Donc, il ne faut donc pas mettre l'initialisation dans cette classe sauf si nécessaire sur chaque appel de méthode?
@ A9S6: Oui - Chaque appel à un service WCF (par défaut) entraîne la création d'une nouvelle instance de classe de service pour gérer la demande. Mais c'est une bonne chose B> !!
(1) Le moyen le plus simple d'y parvenir est avec un TaskID comme vous le souhaitez, puis une autre méthode appelée IStaskComplete avec laquelle le client peut vérifier si la tâche est terminée. P>
(2) Les appels supplémentaires apportés au service démarreront de nouveaux threads. P>
Edit: Le comportement du service par défaut consiste à démarrer de nouveaux threads par appel. La propriété configurable est Mode contextuel d'instance , et peut être réglé sur percall, la perspective ou partageable. p>
Êtes-vous sûr de (2)? Existe-t-il un article qui explique ce comportement ou un moyen de fermer ces threads de service?
La question a une solution, mais j'utilise un service Duplex WCF pour obtenir le résultat d'une opération longue et même si j'ai trouvé un problème qui m'a coûté plusieurs heures à résoudre (et c'est pourquoi j'ai cherché cette question Plus tôt), maintenant cela fonctionne parfaitement et je pense que c'est une solution simple dans le cadre de service duplex du WCF.
Quel est le problème avec une opération longue? Le problème principal consiste à bloquer l'interface client pendant que le serveur effectue l'opération et avec le service Duplex WCF, nous pouvons utiliser un rappel sur le client pour éviter le blocage (il s'agit d'une méthode ancienne pour éviter de bloquer mais il peut être facilement transformé en Le cadre ASYNC / AWAIT à l'aide d'un TaskCompletSource). P>
En bref, la solution utilise une méthode pour démarrer l'opération de manière asynchrone sur le serveur et retourne immédiatement. Lorsque les résultats sont prêts, le serveur les renvoie à l'aide du rappel du client. P>
Premièrement, vous devez suivre un guide standard pour créer des services et des clients duplex de WCF, et j'ai trouvé ces deux utiles: < / p>