Souběžnost
Ukázka souběžnosti ukazuje použití ServiceBehaviorAttribute výčtuConcurrencyMode, který určuje, jestli instance služby zpracovává zprávy postupně nebo souběžně. Ukázka je založená na začínáme, který implementuje ICalculator
kontrakt služby. Tato ukázka definuje nový kontrakt, ICalculatorConcurrency
který dědí ze ICalculator
dvou dalších operací pro kontrolu stavu souběžnosti služby. Změnou nastavení souběžnosti můžete sledovat změnu chování spuštěním klienta.
V této ukázce je klient konzolovou aplikací (.exe) a služba je hostovaná Internetová informační služba (IIS).
Poznámka:
Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.
K dispozici jsou tři režimy souběžnosti:
Single
: Každá instance služby zpracovává vždy jednu zprávu. Toto je výchozí režim souběžnosti.Multiple
: Každá instance služby zpracovává více zpráv současně. Pro použití tohoto režimu souběžnosti musí být implementace služby bezpečná pro přístup z více vláken.Reentrant
: Každá instance služby zpracovává vždy jednu zprávu, ale přijímá opakované volání. Služba přijímá tato volání pouze při volání. Reentrant je ukázaný v ukázce ConcurrencyMode.Reentrant .
Použití souběžnosti souvisí s režimem vytváření instancí. V PerCall instanci není souběžnost relevantní, protože každá zpráva je zpracována novou instancí služby. Při Single vytváření instancí je relevantní buď Single nebo Multiple souběžnost, v závislosti na tom, jestli jedna instance zpracovává zprávy postupně nebo souběžně. Při PerSession vytváření instancí může být některý z režimů souběžnosti relevantní.
Třída služby určuje chování souběžnosti s atributem [ServiceBehavior(ConcurrencyMode=<setting>)]
, jak je znázorněno v ukázce kódu, která následuje. Změnou toho, které řádky se zakomentují, můžete experimentovat s Single
Multiple
režimy souběžnosti. Po změně režimu souběžnosti nezapomeňte službu znovu sestavit.
// 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;
}
}
Ukázka ve výchozím nastavení používá Multiple souběžnost s vytvářením Single instancí. Kód klienta byl upraven tak, aby používal asynchronní proxy server. To umožňuje klientovi provádět více volání do služby, aniž by čekal na odpověď mezi jednotlivými voláními. Můžete sledovat rozdíl v chování režimu souběžnosti služby.
Při spuštění ukázky se požadavky na operace a odpovědi zobrazí v okně konzoly klienta. Zobrazí se režim souběžnosti, pod kterým je spuštěná služba, volá se každá operace a zobrazí se počet operací. Všimněte si, že když je Multiple
režim souběžnosti , výsledky se vrátí v jiném pořadí, než jak byly volány, protože služba zpracovává více zpráv současně. Změnou režimu souběžnosti na Single
, výsledky se vrátí v pořadí, v jakém byly volány, protože služba zpracovává každou zprávu postupně. Stisknutím klávesy ENTER v okně klienta klienta ukončete klienta.
Nastavení, sestavení a spuštění ukázky
Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.
Pokud používáte Svcutil.exe k vygenerování klienta proxy serveru, ujistěte se, že tuto možnost zahrnete
/async
.Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.