Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przykład współbieżności pokazuje, jak użyć ServiceBehaviorAttribute z wyliczeniem ConcurrencyMode, które kontroluje, czy instancja usługi przetwarza komunikaty sekwencyjnie, czy równocześnie. Przykład jest oparty na Wprowadzeniu, który implementuje ICalculator
umowę serwisową. W tym przykładzie zdefiniowano nowy kontrakt ICalculatorConcurrency
, który dziedziczy z ICalculator
, zapewniając dwie dodatkowe operacje do inspekcji stanu współbieżności usługi. Zmieniając ustawienie współbieżności, można zaobserwować zmianę w zachowaniu podczas uruchamiania klienta.
W tym przykładzie klient jest aplikacją konsolową (.exe), a usługa jest hostowana przez usługi Internet Information Services (IIS).
Uwaga / Notatka
Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.
Dostępne są trzy tryby współbieżności:
Single
: Każde wystąpienie usługi przetwarza jeden komunikat naraz. Jest to domyślny tryb współbieżności.Multiple
: każde wystąpienie usługi przetwarza wiele komunikatów jednocześnie. Implementacja usługi musi być bezpieczna wątkowo, aby korzystać z tego trybu współbieżności.Reentrant
: każda instancja usługi przetwarza jeden komunikat naraz, ale akceptuje wywołania reentrantne. Usługa akceptuje te wywołania tylko wtedy, gdy sama inicjuje połączenia. Reentrant jest pokazany w przykładzie ConcurrencyMode.Reentrant.
Użycie współbieżności jest związane z trybem instancji. W PerCall instancji współbieżność nie jest istotna, ponieważ każdy komunikat jest przetwarzany przez nowe wystąpienie usługi. W Single instancingu, albo Single albo Multiple współbieżność jest istotna, w zależności od tego, czy pojedyncze wystąpienie przetwarza komunikaty sekwencyjnie, czy współbieżnie. W PerSession instancji każdy z trybów współbieżności może być istotny.
Klasa usługi określa zachowanie współbieżności z atrybutem [ServiceBehavior(ConcurrencyMode=<setting>)]
, jak pokazano w poniższym przykładzie kodu. Zmieniając, które linie są zakomentowane, możesz eksperymentować z trybami współbieżności Single
i Multiple
. Pamiętaj, aby ponownie skompilować usługę po zmianie trybu współbieżności.
// 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;
}
}
W przykładzie domyślnie jest używana Multiple współbieżność z Single instancjonowaniem. Kod klienta został zmodyfikowany w celu używania asynchronicznego serwera proxy. Dzięki temu klient może wykonywać wiele wywołań do usługi bez oczekiwania na odpowiedź między poszczególnymi wywołaniami. Możesz zaobserwować różnicę w zachowaniu trybu równoczesności działania usługi.
Po uruchomieniu przykładu żądania operacji i odpowiedzi są wyświetlane w oknie konsoli klienta. Wyświetlany jest tryb współbieżności, w którym działa usługa, każda operacja jest wywoływana, a następnie jest wyświetlana liczba operacji. Zwróć uwagę, że gdy tryb współbieżności to Multiple
, wyniki są zwracane w innej kolejności niż były wywoływane, ponieważ usługa przetwarza wiele komunikatów jednocześnie. Zmieniając tryb współbieżności na Single
, wyniki są zwracane w kolejności wywoływanej, ponieważ usługa przetwarza poszczególne komunikaty sekwencyjnie. Naciśnij ENTER w oknie klienta, aby zamknąć klienta.
Aby skonfigurować, skompilować i uruchomić przykładowy program
Upewnij się, że wykonano procedurę instalacji One-Time dla przykładów programu Windows Communication Foundation.
Jeśli używasz Svcutil.exe do generowania klienta serwera proxy, upewnij się, że jest dostępna
/async
opcja.Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w Kompilowanie przykładów Windows Communication Foundation.
Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w Uruchamianie przykładów programu Windows Communication Foundation.