ConcurrencyMode ReentrantConcurrencyMode Reentrant

In diesem Beispiel werden die Notwendigkeit und Auswirkungen der Verwendung von ConcurrencyMode.Reentrant in einer Dienstimplementierung veranschaulicht.This sample demonstrates the necessity and implications of using ConcurrencyMode.Reentrant on a service implementation. ConcurrencyMode.Reentrant impliziert, dass der Dienst (oder Rückruf) nur jeweils eine Nachricht verarbeitet (analog zu ConcurencyMode.Single).ConcurrencyMode.Reentrant implies that the service (or callback) processes only one message at a given time (analogous to ConcurencyMode.Single). Um Threadsicherheit zu gewährleisten, Windows Communication Foundation (WCF) sperrt die InstanceContext Verarbeitung einer Nachricht, damit keine anderen Nachrichten verarbeitet werden können.To ensure thread safety, Windows Communication Foundation (WCF) locks the InstanceContext processing a message so that no other messages can be processed. Im Reentrant-Modus wird der InstanceContext entsperrt, kurz bevor der Dienst einen ausgehenden Aufruf ausführt. So kann der folgende Aufruf (der wie in diesem Beispiel dargestellt wiedereintrittsfähig sein kann) beim nächsten Mal gesperrt werden, wenn er den Dienst erreicht.In case of Reentrant mode, the InstanceContext is unlocked just before the service makes an outgoing call thereby allowing the subsequent call, (which can be reentrant as demonstrated in the sample) to get the lock next time it comes in to the service. Zum Veranschaulichen des Verhaltens wird im Beispiel gezeigt, wie ein Client und ein Dienst untereinander Nachrichten mit einem Duplexvertrag senden können.To demonstrate the behavior, the sample shows how a client and service can send messages between each other using a duplex contract.

Bei dem definierten Vertrag handelt es sich um einen Duplexvertrag, bei dem die Ping-Methode vom Dienst und die Rückrufmethode Pong vom Client implementiert wird.The contract defined is a duplex contract with the Ping method being implemented by the service and the callback method Pong being implemented by the client. Ein Client ruft die Ping-Methode des Servers mit einer Tickanzahl auf und initiiert so den Aufruf.A client invokes the server's Ping method with a tick count thereby initiating the call. Der Dienst überprüft, ob die Anzahl der Ticks ungleich 0 (null) ist, und ruft dann die Pong-Methode des Rückrufs auf, während die Tickanzahl verringert wird.The service checks whether the tick count is not equal to 0 and then invokes the callbacks Pong method while decrementing the tick count. Dies wird im Beispiel mit dem folgenden Code ausgeführt.This is done by the following code in the sample.

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));  
     }  
}  

Die Pong-Implementierung des Rückrufs weist die gleiche Logik wie die Ping-Implementierung auf. Das heißt, es wird überprüft, ob die Anzahl der Ticks ungleich 0 (null) ist, und dann wird die Ping-Methode über den Rückrufkanal aufgerufen, wobei die Anzahl der Ticks um 1 reduziert wird. (in diesem Fall ist der Rückrufkanal der Kanal, über den die ursprüngliche Ping-Meldung gesendet wurde.) Wenn die Anzahl der Ticks 0 erreicht, kehrt die Methode zurück und entpackt dabei alle Antworten auf den ersten Aufruf, der vom Client getätigt wurde, der den Aufruf initiiert hat. Dies wird in der Rückrufimplementierung gezeigt.This is shown in the callback implementation.

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));  
    }  
}  

Die Ping-Methode und die Pong-Methode sind Anforderung/Antwort-Methoden. Der erste Aufruf von Ping wird daher erst zurückgegeben, wenn der Aufruf von CallbackChannel<T>.Pong() zurückgegeben wurde. Auf dem Client kann die Pong-Methode erst zurückgegeben werden, wenn der nächste Ping-Aufruf, den sie vorgenommen hat, zurückgegeben wurde. Da der Rückruf und der Dienst ausgehende Anforderung/Antwort-Aufrufe ausführen müssen, damit sie für die ausstehende Anforderung antworten können, müssen beide Implementierungen mit dem ConcurrencyMode.Reentrant-Verhalten gekennzeichnet werden.Because both the callback and the service must make outgoing request/reply calls before they can reply for the pending request, both the implementations must be marked with the ConcurrencyMode.Reentrant behavior.

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Um das Beispiel in einer einzelnen oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

VeranschaulichtDemonstrates

Erstellen Sie zum Ausführen des Beispiels das Client- und Serverprojekt.To run the sample, build the client and server projects. Klicken Sie dann zwei Befehlsfenster öffnen und ändern Sie die Verzeichnisse an, die <Beispiel > \CS\Service\bin\debug und <Beispiel > \CS\Client\bin\debug Verzeichnisse.Then open two command windows and change the directories to the <sample>\CS\Service\bin\debug and <sample>\CS\Client\bin\debug directories. Starten Sie den Dienst durch Eingabe service.exe und rufen Sie dann Client.exe mit der Anfangswert für die Tickanzahl als Eingabeargument übergeben.Then start the service by typing service.exe and then invoke the Client.exe with the initial value of ticks passed as an input argument. Es wird eine Beispielausgabe für 10 Ticks veranschaulicht.A sample output for 10 ticks is shown.

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  

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Services\Reentrant

Siehe auchSee Also