2010-11-09 12 views
3

Actuellement, je n'utilise pas de références de service car je pense que le code généré automatiquement est plus lourd que nécessaire. Au lieu de cela, je produis une classe proxy en faisant:Création de clients WCF asynchrones sans utiliser les références de service

public class MyClient : ClientBase<IMyService>, IMyService 

Cela a beaucoup travaillé pour moi, pas de classes proxy sont générées donc je réutiliser les mêmes types de données. Mais cela ne me permet que de créer des méthodes client synchrones.

Que faudrait-il pour générer des versions asynchrones? J'ai jeté un coup d'oeil sur le code généré automatiquement que l'ajout d'une référence de service ferait et il semble que cela soit trop simple. Y a-t-il une manière plus simple avec moins d'échafaudage nécessaire pour créer des méthodes de client asynchrone?

Mon objectif final ultime est d'être en mesure d'utiliser le nouveau C# 5 async/attendent des mots-clés sur les clients webservice

+0

Comment mesurez-vous ce "poids"? Avez-vous fait une analyse de performance? –

+0

quand je dis poids, je ne veux pas dire une pénalité de performance, mais plutôt le volume de code généré. Je préférerais quelque chose de plus propre – puffpio

Répondre

2

Vous pouvez toujours l'auteur un contrat IMyAsyncService qui est exactement comme IMyService mais utilise Begin/End modèle async (et a [ServiceContract(Name="IMyService")] de garder le même nom). Ce sera le même contrat de fil, et de travailler avec ClientBase, mais maintenant vous avez des méthodes asynchrones que vous pouvez utiliser avec await.

+0

Je pensais à cela aussi, mais j'ai regardé quelques exemples pour implémenter le modèle Async côté serveur, et vous devez toujours créer un tas de types AsyncResult personnalisés pour chaque paire Begin/End. ..which à moi ne semble pas aussi propre. – puffpio

+0

Le "travail" réel de la méthode se produit également dans vos types personnalisés et non dans le bloc Début ou Fin, donc cela sépare l'intention de la méthode de l'implémentation. – puffpio

+0

Vous n'avez pas besoin de faire cela sur le serveur, seulement sur le client. Laissez le serveur et IMyService tel quel. Ajoutez simplement un nouveau type de contrat client asynchrone. Ce sera compatible avec le serveur, mais faites le modèle asynchrone. – Brian

0

Je pense ajouter cette [OperationContract (IsOneWay = true)]

à votre déclaration de méthode dans l'interface sur vos services déterminera son async.