2009-12-14 3 views
7

Quelle est la différence entre le marquage d'une méthode WCF avecQuelle est la différence entre [OperationContract (IsOneWay = true)] et la case à cocher des opérations asynchrones générées?

[OperationContract(IsOneWay = true)]

attribut et la vérification de la case à cocher asynchrone générer opérations lors de l'ajout d'une référence de service? D'après ce que j'ai lu, il semble que la nature asynchrone de l'appel ne devrait être définie que du côté client. Si tel est le cas, quel est le point de [OperationContract(IsOneWay = true)]?

À l'heure actuelle, la méthode suivante s'exécute dans la méthode WCF.

public void UpdateIndex(IndexElement[] indexElements) 
    { 
     // start the update on a new thread. 
     Thread thread = new Thread(() => UpdateIndexThread(indexElements)); 
     thread.Start(); 
    } 

J'ai créé une référence de service dans le code de mon client, et je demande simplement:

indexerClient.UpdateIndex(indexElements); 

indexerClient est une instance de mon service WCF.

Est-ce que cela devrait aussi fonctionner? Cela ne semble pas, c'est presque comme si elle attendait que le fil se termine avant de revenir.

Répondre

11

Ce sont très différents. À un niveau conceptuel, IsOneWay = true indique que le modèle de messagerie est «fire and forget», par opposition à, par ex. 'demande de réponse'. C'est-à-dire, IOW = true signifie qu'il y a un message du client au serveur, mais pas une réponse du serveur au client. Au contraire, une méthode non-IOW = true aura typiquement un message de réponse, même si le type de retour est vide (par exemple un message 'vide').

Le motif asynchrone correspond au comportement du code client, par ex. bloque-t-il l'attente de la valeur de retour ou non. Async est une chose «locale», voir this blog pour plus de détails. Vous pouvez avoir un client asynchrone pour un serveur de synchronisation ou un client de synchronisation pour un serveur asynchrone. WCF fera la magie sous le capot pour vous donner un modèle de programmation. Si vous avez par exemple un modèle de messagerie de demande-réponse et utilisez 'generate async', le client généré vous donnera par ex. une méthode que vous pouvez appeler async (par exemple, envoyez le message et recevez un rappel lorsque la réponse arrive).

Utilisez donc 'async' pour 'modèle de programmation locale' et utilisez IOW pour 'messagerie sur le réseau'.

Notez que dans votre exemple, si vous marquez la méthode IOW = true, alors je pense qu'il n'y a aucune raison pour Thread.Start() dans le code du serveur. Vous pouvez juste faire le travail là sur le fil que WCF a donné à votre serveur.

+0

Cela a beaucoup de sens! Merci beaucoup - cela soulage beaucoup de frustration! – Matt

+0

Juste pour éclaircir, cela devrait lire de cette façon non? En d'autres termes, IOW = true signifie qu'il y a un message du client au serveur et une réponse du serveur au client. En revanche, une méthode non-IOW = true n'aura généralement PAS de message de réponse, même si le type de retour est vide (par exemple un message 'vide'). – Matt

+0

Merci, j'avais une phrase en arrière, je viens d'éditer pour corriger. – Brian