Udostępnij za pośrednictwem


Współbieżność

Przykład współbieżności demonstruje użycie elementu ServiceBehaviorAttribute z ConcurrencyMode wyliczeniem, które kontroluje, czy wystąpienie usługi przetwarza komunikaty sekwencyjnie, czy współbieżnie. Przykład jest oparty na rozpoczynaniu pracy, która implementuje ICalculator kontrakt usługi. W tym przykładzie zdefiniowano nowy kontrakt , ICalculatorConcurrencyktóry dziedziczy z ICalculatorprogramu , zapewniając dwie dodatkowe operacje na potrzeby inspekcji stanu współbieżności usługi. Zmieniając ustawienie współbieżności, można zaobserwować zmianę zachowania, uruchamiając klienta.

W tym przykładzie klient jest aplikacją konsolową (.exe), a usługa jest hostowana przez usługi Internet Information Services (IIS).

Uwaga

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żde wystąpienie usługi przetwarza jeden komunikat naraz, ale akceptuje wywołania ponownego jednostki. Usługa akceptuje te wywołania tylko wtedy, gdy jest wywoływana. Reentrant jest pokazany w przykładzie ConcurrencyMode.Reentrant .

Użycie współbieżności jest związane z trybem stancingu. W PerCall stancingu współbieżność nie jest istotne, ponieważ każdy komunikat jest przetwarzany przez nowe wystąpienie usługi. W Single przypadku instancingu lub MultipleSingle współbieżności jest istotne, w zależności od tego, czy pojedyncze wystąpienie przetwarza komunikaty sekwencyjnie, czy współbieżnie. W PerSession stanie instancingu 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 komentarze wierszy, możesz eksperymentować z trybami Single współbieżności 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 zachowaniem instancingu. 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 współbieżności 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ż wywoływana, 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 klawisz ENTER w oknie klienta, aby zamknąć klienta.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Jeśli używasz Svcutil.exe do generowania klienta proxy, upewnij się, że jest dostępna /async opcja.

  3. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  4. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.