Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
L’exemple Reentrant illustre la nécessité et les implications de l’utilisation de ConcurrencyMode.Reentrant sur une implémentation de service. ConcurrencyMode.Reentrant implique que le service (plus exactement l'interface de rappel) traite un seul message à la fois à un instant donné (traitement similaire à celui proposé par le mode ConcurencyMode.Single). Pour garantir la sécurité des threads, Windows Communication Foundation (WCF) verrouille le InstanceContext traitement d’un message afin qu’aucun autre message ne puisse être traité. En mode ConcurrencyMode.Reentrant, le contexte InstanceContext est déverrouillé juste avant que le service n'effectue un appel externe, autorisant ainsi le prochain appel (lequel peut être réentrant tel qu'illustré dans l'exemple) et l'obtention du verrouillage lorsque le service reçoit la réponse à son appel. Pour illustrer le comportement, l’exemple montre comment un client et un service peuvent envoyer des messages entre eux à l’aide d’un contrat duplex.
Le contrat défini est un contrat duplex avec la Ping méthode implémentée par le service et la méthode Pong de rappel implémentée par le client. Le client appelle la méthode Ping du serveur à l'aide d'un compteur de cycles initiant par la même l'appel. Le service s'assure que la valeur du compteur de cycles n'est pas égale à zéro, puis appelle la méthode de rappel Pong tout en décrémentant la valeur de ce compteur. Pour ce faire, vous trouverez le code suivant dans l’exemple.
public void Ping(int ticks)
{
Console.WriteLine("Ping: Ticks = " + ticks);
//Keep pinging back and forth till Ticks reaches 0.
if (ticks != 0)
{
OperationContext.Current.GetCallbackChannel<IPingPongCallback>().Pong((ticks - 1));
}
}
L’implémentation du rappel Pong suit la même logique que celle de l’implémentation Ping. Autrement dit, il vérifie si le nombre de graduations n’est pas égal à zéro, puis appelle la Ping méthode sur le canal de rappel (dans ce cas, il s’agit du canal utilisé pour envoyer le message d’origine Ping ) avec le nombre de graduations décrémenté par 1. Lorsque ce nombre atteint zéro, la méthode est retournée, désencapsulant toutes les réponses au premier appel initié par le client. Ce processus est illustré dans l'implémentation du rappel.
public void Pong(int ticks)
{
Console.WriteLine("Pong: Ticks = " + ticks);
if (ticks != 0)
{
//Retrieve the Callback Channel (in this case the Channel which was used to send the
//original message) and make an outgoing call until ticks reaches 0.
IPingPong channel = OperationContext.Current.GetCallbackChannel<IPingPong>();
channel.Ping((ticks - 1));
}
}
Les deux méthodes Ping et Pong sont de type requête/réponse, ce qui signifie que le premier appel à Ping ne se termine pas avant que l'appel à CallbackChannel<T>.Pong() ne soit terminé. Sur le client, la méthode Pong ne peut pas être retournée tant que le prochain appel de la méthode Ping effectué n'est pas retourné. Le rappel et le service devant tous deux effectuer des appels externes de type demande-réponse avant de pouvoir répondre à la demande en attente, le comportement ConcurrencyMode.Reentrant doit être spécifié pour leurs implémentations respectives.
Pour configurer, générer et exécuter l’exemple
Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.
Pour générer l’édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Building the Windows Communication Foundation Samples.
Pour exécuter l’exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Exécution des exemples Windows Communication Foundation.
Montre ce qui suit
Pour exécuter l’exemple, générez les projets client et serveur. Ouvrez ensuite deux fenêtres de commande et remplacez les répertoires par les <répertoires sample>\CS\Service\bin\debug et <sample>\CS\Client\bin\debug directories. Démarrez ensuite le service en entrant service.exe, puis appelez Client.exe en passant la valeur initiale du compteur de cycles sous forme d’argument d’entrée. Le code suivant illustre le résultat pour 10 cycles.
Prompt>Service.exe
ServiceHost Started. Press Enter to terminate service.
Ping: Ticks = 10
Ping: Ticks = 8
Ping: Ticks = 6
Ping: Ticks = 4
Ping: Ticks = 2
Ping: Ticks = 0
Prompt>Client.exe 10
Pong: Ticks = 9
Pong: Ticks = 7
Pong: Ticks = 5
Pong: Ticks = 3
Pong: Ticks = 1