Samtidighet
Exemplet Concurrency visar hur du använder ServiceBehaviorAttribute med ConcurrencyMode uppräkningen, som styr om en instans av en tjänst bearbetar meddelanden sekventiellt eller samtidigt. Exemplet baseras på Komma igång, som implementerar tjänstkontraktet ICalculator
. Det här exemplet definierar ett nytt kontrakt, , ICalculatorConcurrency
som ärver från ICalculator
och tillhandahåller ytterligare två åtgärder för att inspektera tillståndet för tjänstens samtidighet. Genom att ändra samtidighetsinställningen kan du observera ändringen i beteendet genom att köra klienten.
I det här exemplet är klienten ett konsolprogram (.exe) och tjänsten hanteras av Internet Information Services (IIS).
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Det finns tre samtidighetslägen:
Single
: Varje tjänstinstans bearbetar ett meddelande i taget. Det här är standardläget för samtidighet.Multiple
: Varje tjänstinstans bearbetar flera meddelanden samtidigt. Tjänstimplementeringen måste vara trådsäker för att använda det här samtidighetsläget.Reentrant
: Varje tjänstinstans bearbetar ett meddelande i taget, men accepterar återaktiveringsanrop. Tjänsten accepterar endast dessa anrop när den anropar. Reentrant visas i exemplet ConcurrencyMode.Reentrant .
Användningen av samtidighet är relaterad till instancing-läget. Vid PerCall instancing är samtidighet inte relevant, eftersom varje meddelande bearbetas av en ny tjänstinstans. Vid Single instancing är antingen Single eller Multiple samtidighet relevant, beroende på om den enskilda instansen bearbetar meddelanden sekventiellt eller samtidigt. Vid PerSession instancing kan något av samtidighetslägena vara relevant.
Tjänstklassen anger samtidighetsbeteende med [ServiceBehavior(ConcurrencyMode=<setting>)]
attributet som visas i kodexemplet som följer. Genom att ändra vilka rader som kommenteras ut kan du experimentera med lägena Single
och Multiple
samtidigheten. Kom ihåg att återskapa tjänsten när du har ändrat samtidighetsläget.
// 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;
}
}
Exemplet använder Multiple samtidighet med Single instancing som standard. Klientkoden har ändrats för att använda en asynkron proxy. Detta gör att klienten kan göra flera anrop till tjänsten utan att vänta på ett svar mellan varje anrop. Du kan se skillnaden i beteendet för tjänstens samtidighetsläge.
När du kör exemplet visas åtgärdsbegäranden och svar i klientkonsolfönstret. Samtidighetsläget som tjänsten körs under visas, varje åtgärd anropas och sedan visas antalet åtgärder. Observera att när samtidighetsläget är Multiple
returneras resultaten i en annan ordning än hur de anropades, eftersom tjänsten bearbetar flera meddelanden samtidigt. Genom att ändra samtidighetsläget till Single
returneras resultaten i den ordning de anropades, eftersom tjänsten bearbetar varje meddelande sekventiellt. Tryck på RETUR i klientfönstret för att stänga av klienten.
Så här konfigurerar du, skapar och kör exemplet
Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Om du använder Svcutil.exe för att generera proxyklienten kontrollerar du att du inkluderar alternativet
/async
.Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.
Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.