Delen via


Gelijktijdigheid

In het voorbeeld Gelijktijdigheid wordt het gebruik van de ConcurrencyModeServiceBehaviorAttribute opsomming gedemonstreerd, waarmee wordt bepaald of een exemplaar van een service berichten opeenvolgend of gelijktijdig verwerkt. Het voorbeeld is gebaseerd op aan de slag, waarmee het ICalculator servicecontract wordt geïmplementeerd. In dit voorbeeld wordt een nieuw contract gedefinieerd, ICalculatorConcurrencydat overschrijft van ICalculator, waarbij twee extra bewerkingen worden geboden voor het inspecteren van de status van de gelijktijdigheid van de service. Door de gelijktijdigheidsinstelling te wijzigen, kunt u de wijziging in gedrag observeren door de client uit te voeren.

In dit voorbeeld is de client een consoletoepassing (.exe) en wordt de service gehost door Internet Information Services (IIS).

Notitie

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

Er zijn drie gelijktijdigheidsmodi beschikbaar:

  • Single: Elk service-exemplaar verwerkt één bericht tegelijk. Dit is de standaard gelijktijdigheidsmodus.

  • Multiple: Elk service-exemplaar verwerkt meerdere berichten tegelijk. De service-implementatie moet thread-safe zijn om deze gelijktijdigheidsmodus te kunnen gebruiken.

  • Reentrant: Elk service-exemplaar verwerkt één bericht tegelijk, maar accepteert opnieuw aanroepen. De service accepteert deze aanroepen alleen wanneer deze worden aangeroepen. Reentrant wordt gedemonstreerd in het voorbeeld ConcurrencyMode.Reentrant .

Het gebruik van gelijktijdigheid is gerelateerd aan de modus voor instancing. Instancing PerCall is gelijktijdigheid niet relevant, omdat elk bericht wordt verwerkt door een nieuw service-exemplaar. Bij Single instancing is of SingleMultiple gelijktijdigheid relevant, afhankelijk van of het ene exemplaar berichten sequentieel of gelijktijdig verwerkt. Bij PerSession het instancing kunnen alle gelijktijdigheidsmodi relevant zijn.

De serviceklasse specificeert gelijktijdigheidsgedrag met het [ServiceBehavior(ConcurrencyMode=<setting>)] kenmerk, zoals wordt weergegeven in het codevoorbeeld dat volgt. Door te wijzigen welke regels worden uitgecommentarieerd, kunt u experimenteren met de Single modi voor gelijktijdigheid.Multiple Vergeet niet om de service opnieuw te bouwen nadat u de gelijktijdigheidsmodus hebt gewijzigd.

// Single allows a single message to be processed sequentially by each service instance.
//[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]

// Multiple allows concurrent processing of multiple messages by a service instance.
// The service implementation should be thread-safe. This can be used to increase throughput.
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]

// Uses Thread.Sleep to vary the execution time of each operation.
public class CalculatorService : ICalculatorConcurrency
{
    int operationCount;

    public double Add(double n1, double n2)
    {
        operationCount++;
        System.Threading.Thread.Sleep(180);
        return n1 + n2;
    }

    public double Subtract(double n1, double n2)
    {
        operationCount++;
        System.Threading.Thread.Sleep(100);
        return n1 - n2;
    }

    public double Multiply(double n1, double n2)
    {
        operationCount++;
        System.Threading.Thread.Sleep(150);
        return n1 * n2;
    }

    public double Divide(double n1, double n2)
    {
        operationCount++;
        System.Threading.Thread.Sleep(120);
        return n1 / n2;
    }

    public string GetConcurrencyMode()
    {
        // Return the ConcurrencyMode of the service.
        ServiceHost host = (ServiceHost)OperationContext.Current.Host;
        ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
        return behavior.ConcurrencyMode.ToString();
    }

    public int GetOperationCount()
    {
        // Return the number of operations.
        return operationCount;
    }
}

Het voorbeeld maakt standaard gebruik Multiple van gelijktijdigheid met Single instancing. De clientcode is gewijzigd om een asynchrone proxy te gebruiken. Hierdoor kan de client meerdere aanroepen naar de service uitvoeren zonder te wachten op een reactie tussen elke oproep. U kunt het verschil in gedrag van de gelijktijdigheidsmodus van de service observeren.

Wanneer u het voorbeeld uitvoert, worden de bewerkingsaanvragen en -antwoorden weergegeven in het clientconsolevenster. De gelijktijdigheidsmodus waaronder de service wordt uitgevoerd, wordt weergegeven, elke bewerking wordt aangeroepen en vervolgens wordt het aantal bewerkingen weergegeven. U ziet dat wanneer de gelijktijdigheidsmodus is Multiple, de resultaten in een andere volgorde worden geretourneerd dan hoe ze werden aangeroepen, omdat de service meerdere berichten gelijktijdig verwerkt. Door de gelijktijdigheidsmodus te Singlewijzigen in, worden de resultaten geretourneerd in de volgorde waarin ze zijn aangeroepen, omdat de service elk bericht opeenvolgend verwerkt. Druk op Enter in het clientvenster om de client af te sluiten.

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 Svcutil.exe gebruikt om de proxyclient te genereren, moet u ervoor zorgen dat u de /async optie opneemt.

  3. 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.

  4. 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.