Sdílet prostřednictvím


Konkurentnost

Ukázka souběžnosti demonstruje, jak používat ServiceBehaviorAttribute s výčtemConcurrencyMode, 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 smlouvu o službách ICalculator. Tato ukázka definuje nový kontrakt, ICalculatorConcurrency, který dědí z ICalculator a poskytuje dvě další operace 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á internetovou informační službou (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í paralelismu souvisí s režimem instancování. 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 jsou zakomentovány, můžete experimentovat s Single a Multiple souběžnými režimy. 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á souběžnost s vytvářením instancí MultipleSingle. 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, poté je volána každá operace a nakonec se zobrazí počet operací. Všimněte si, že když je Multiplerež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.

Jak nastavit, sestavit a spustit ukázku

  1. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  2. Pokud používáte Svcutil.exe k vygenerování klienta proxy serveru, ujistěte se, že tuto možnost zahrnete /async .

  3. Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.

  4. Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.