Delen via


ConcurrencyMode Reentrant

Het reentrant-voorbeeld toont de noodzaak en implicaties van het gebruik van ConcurrencyMode.Reentrant voor een service-implementatie. ConcurrencyMode.Reentrant impliceert dat de service (of callback) slechts één bericht tegelijk verwerkt (vergelijkbaar met ConcurencyMode.Single). Om de veiligheid van threads te garanderen, vergrendelt Windows Communication Foundation (WCF) de InstanceContext verwerking van een bericht, zodat er geen andere berichten kunnen worden verwerkt. In het geval van de reentrant-modus wordt de InstanceContext ontgrendeld net voordat de service een uitgaande oproep uitvoert, waardoor de volgende aanroep (die opnieuw kan worden getypt zoals in het voorbeeld wordt gedemonstreerd) de vergrendeling krijgt de volgende keer dat deze bij de service komt. Om het gedrag te demonstreren, laat het voorbeeld zien hoe een client en service berichten tussen elkaar kunnen verzenden met behulp van een dubbelzijdig contract.

Het gedefinieerde contract is een dubbelzijdig contract met de Ping methode die door de service wordt geïmplementeerd en de callback-methode Pong die door de client wordt geïmplementeerd. Een client roept de methode van Ping de server aan met een aantal tikken, waardoor de aanroep wordt gestart. De service controleert of het aantal tikken niet gelijk is aan 0 en roept vervolgens de callback-methode Pong aan terwijl het aantal tikken wordt afgebroken. Dit wordt gedaan door de volgende code in het voorbeeld.

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

De implementatie van Pong de callback heeft dezelfde logica als de Ping implementatie. Dat wil gezegd: het controleert of het aantal tikken niet nul is en roept vervolgens de Ping methode aan op het callback-kanaal (in dit geval het kanaal dat is gebruikt om het oorspronkelijke Ping bericht te verzenden) met het aantal tikken afgebroken door 1. Het moment dat het aantal tikken 0 bereikt, retourneert de methode waardoor alle antwoorden worden teruggepakt naar de eerste aanroep die door de client is gedaan die de aanroep heeft gestart. Dit wordt weergegeven in de callback-implementatie.

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

Zowel de als Pong de Ping methoden zijn aanvraag/antwoord, wat betekent dat de eerste aanroep waarnaar Ping niet wordt geretourneerd, wordt geretourneerd totdat de aanroep wordt CallbackChannel<T>.Pong() geretourneerd. Op de client kan de Pong methode pas worden geretourneerd als de volgende Ping aanroep die is geretourneerd. Omdat zowel de callback als de service uitgaande aanvraag/antwoordaanroepen moet maken voordat ze kunnen reageren op de aanvraag in behandeling, moeten beide implementaties worden gemarkeerd met het gedrag ConcurrencyMode.Reentrant.

Het voorbeeld instellen, compileren en uitvoeren

  1. Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  2. Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.

  3. Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.

Demonstreert

Als u het voorbeeld wilt uitvoeren, bouwt u de client- en serverprojecten. Open vervolgens twee opdrachtvensters en wijzig de mappen in het <voorbeeld>\CS\Service\bin\debug en <sample>\CS\Client\bin\debug directory's. Start vervolgens de service door te typen service.exe en vervolgens de Client.exe aan te roepen met de initiële waarde van tikken die zijn doorgegeven als invoerargument. Er wordt een voorbeelduitvoer weergegeven voor 10 tikken.

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