Megosztás a következőn keresztül:


Egyidejűség

Az egyidejűségi minta bemutatja a ServiceBehaviorAttribute számbavétel használatát ConcurrencyMode , amely azt szabályozza, hogy egy szolgáltatáspéldány egymás után vagy párhuzamosan dolgozza-e fel az üzeneteket. A minta a szolgáltatásszerződést megvalósító ICalculator első lépéseken alapul. Ez a minta egy új szerződést határoz meg, ICalculatorConcurrencyamelytől ICalculatoröröklődik, és két további műveletet biztosít a szolgáltatás egyidejűségének vizsgálatához. Az egyidejűség beállításának módosításával megfigyelheti a viselkedés változását az ügyfél futtatásával.

Ebben a mintában az ügyfél egy konzolalkalmazás (.exe), és a szolgáltatást az Internet Information Services (IIS) üzemelteti.

Feljegyzés

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

Három egyidejűségi mód érhető el:

  • Single: Minden szolgáltatáspéldány egyszerre egy üzenetet dolgoz fel. Ez az alapértelmezett egyidejűségi mód.

  • Multiple: Minden szolgáltatáspéldány egyszerre több üzenetet dolgoz fel. Ennek az egyidejűségi módnak a használatához a szolgáltatás implementációjának szálbiztosnak kell lennie.

  • Reentrant: Minden szolgáltatáspéldány egyszerre egy üzenetet dolgoz fel, de fogad újraküldéses hívásokat. A szolgáltatás csak akkor fogadja ezeket a hívásokat, amikor az ki van hívva. A reentrant a ConcurrencyMode.Reentrant mintában van bemutatva.

Az egyidejűség használata az instancing módhoz kapcsolódik. Instancing esetén PerCall az egyidejűség nem releváns, mert minden üzenetet egy új szolgáltatáspéldány dolgoz fel. Az Single instancingban vagy SingleMultiple az egyidejűség releváns attól függően, hogy az egyetlen példány egymás után vagy párhuzamosan dolgozza fel az üzeneteket. Instancing esetén PerSession az egyidejűségi módok bármelyike releváns lehet.

A szolgáltatásosztály az attribútummal való egyidejűségi viselkedést határozza meg az [ServiceBehavior(ConcurrencyMode=<setting>)] alábbi kódmintában látható módon. A megjegyzésben szereplő sorok módosításával kísérletezhet az SingleMultiple egyidejűségi módokkal. Ne feledje újraépíteni a szolgáltatást az egyidejűségi mód módosítása után.

// 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;
    }
}

A minta alapértelmezés szerint egyidejűséget Single és instancingot használMultiple. Az ügyfélkódot úgy módosítottuk, hogy aszinkron proxyt használjon. Így az ügyfél több hívást is kezdeményezhet a szolgáltatáshoz anélkül, hogy az egyes hívások között válaszra vár. Megfigyelheti a szolgáltatás egyidejűségi módjának viselkedésbeli különbségét.

A minta futtatásakor a műveleti kérelmek és a válaszok megjelennek az ügyfélkonzol ablakában. Megjelenik az egyidejűségi mód, amely alatt a szolgáltatás fut, minden műveletet meghív, majd megjelenik a műveletszám. Figyelje meg, hogy az egyidejűségi mód Multipleesetén a rendszer az eredményeket a meghívásuktól eltérő sorrendben adja vissza, mivel a szolgáltatás egyszerre több üzenetet dolgoz fel. Az egyidejűségi mód Singlemódosításával a rendszer az eredményeket a meghívott sorrendben adja vissza, mivel a szolgáltatás egymás után dolgozza fel az egyes üzeneteket. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.

A minta beállítása, összeállítása és futtatása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták egyszeri beállítási eljárását.

  2. Ha Svcutil.exe használ a proxyügyfél létrehozásához, győződjön meg arról, hogy a /async lehetőséget is használja.

  3. A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse a Windows Communication Foundation-minták készítéséhez szükséges utasításokat.

  4. Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat.