ConcurrencyMode.ReentrantConcurrencyMode Reentrant

In questo esempio vengono descritte la necessità e le implicazioni dell'utilizzo di ConcurrencyMode.Reentrant in un'implementazione del servizio.This sample demonstrates the necessity and implications of using ConcurrencyMode.Reentrant on a service implementation. ConcurrencyMode.Reentrant implica che il servizio (o callback) elabora solo uno messaggio a un'ora specificata (come per ConcurencyMode.Single).ConcurrencyMode.Reentrant implies that the service (or callback) processes only one message at a given time (analogous to ConcurencyMode.Single). Per garantire la thread safety, Windows Communication Foundation (WCF) Blocca il InstanceContext elabori un messaggio in modo che nessun altro messaggio possa essere elaborato.To ensure thread safety, Windows Communication Foundation (WCF) locks the InstanceContext processing a message so that no other messages can be processed. Nel caso della modalità Reentrant, InstanceContext viene sbloccato poco prima che il servizio effettui una chiamata in uscita, consentendo alla chiamata successiva (che può essere rientrante, come illustrato nell'esempio) di eseguire il blocco la prossima volta che entra nel servizio.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. Per descrivere il comportamento, nell'esempio viene illustrato come un client e un servizio possono inviarsi messaggi utilizzando un contratto duplex.To demonstrate the behavior, the sample shows how a client and service can send messages between each other using a duplex contract.

Il contratto definito è un contratto duplex con il metodo Ping implementato dal servizio e il metodo di callback Pong implementato dal client.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. Un client richiama il metodo Ping del server con un conteggio di tick, avviando così la chiamata.A client invokes the server's Ping method with a tick count thereby initiating the call. Il servizio verifica se il conteggio di tick non è uguale a 0 e richiama quindi il metodo Pong del callback, mentre esegue il decremento del conteggio di tick.The service checks whether the tick count is not equal to 0 and then invokes the callbacks Pong method while decrementing the tick count. Questa operazione viene eseguita nell'esempio di codice seguente: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));  
     }  
}  

L'implementazione Pong del callback è dotata della stessa logica dell'implementazione Ping. Ovvero, controlla se il conteggio non è zero, quindi richiama il metodo Ping sul canale di callback (in questo caso il canale utilizzato per inviare il messaggio Ping originale) con il conteggio decrementato di 1. Nel momento in cui il conteggio raggiunge lo zero, il metodo viene completato, annullando così il wrapping di tutte le risposte fino alla prima chiamata effettuata dal client che ha avviato la chiamata. Questa operazione viene illustrata nell'implementazione del callback.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));  
    }  
}  

Entrambi i metodi Ping e Pong sono di tipo request/reply, il che significa che la prima chiamata a Ping non viene restituita finché non viene restituita la chiamata a CallbackChannel<T>.Pong(). Nel client, il metodo Pong non può essere completato finché non viene restituita la chiamata Ping successiva. Poiché il callback e il servizio devono eseguire chiamate in uscita di tipo request/reply prima che possano rispondere alla richiesta in sospeso, entrambi le implementazioni devono essere contrassegnate dal comportamento ConcurrencyMode.Reentrant.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.

Per impostare, compilare ed eseguire l'esempioTo set up, build, and run the sample

  1. Assicurarsi di avere eseguito la procedura di installazione singola per gli esempi di Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Building the Windows Communication Foundation Samples.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Per eseguire l'esempio in una configurazione singola o tra computer, seguire le istruzioni in esegue gli esempi di Windows Communication Foundation.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

DimostrazioneDemonstrates

Per eseguire l'esempio, compilare i progetti del client e del server.To run the sample, build the client and server projects. Quindi aprire due finestre di comando e modificare le directory in cui il <esempio > \CS\Service\bin\debug e <esempio > directory \CS\Client\bin\debug.Then open two command windows and change the directories to the <sample>\CS\Service\bin\debug and <sample>\CS\Client\bin\debug directories. Avviare il servizio digitando service.exe e richiamare quindi Client.exe con il valore iniziale di tick passato come argomento di input.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. Viene illustrato un esempio di output per tick.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  

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.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. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

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

Vedere ancheSee Also