Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A konkurenciai minta bemutatja a ServiceBehaviorAttribute használatát a ConcurrencyMode enumerációval, amely szabályozza, hogy egy szolgáltatáspéldány sorban vagy párhuzamosan dolgozza fel az üzeneteket. A minta a Kezdő lépések-en alapul, amely megvalósítja a ICalculator szolgáltatásszerződést. 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.
Megjegyzé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 ő kezdeményezi. A reentrant működést a ConcurrencyMode.Reentrant mintában mutatják be.
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. A Single példányosítás esetén a Single vagy a Multiple 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. Azoknak a soroknak a módosításával, amelyek meg vannak jegyzetelve, kísérletezhet az Single és Multiple párhuzamos végrehajtási 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 a Multiple egyidejűséget és a Single példányosítást használja. 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 példa beállítása, elkészítése és futtatása
Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.
Ha a proxy ügyfél létrehozásához Svcutil.exe-t használ, győződjön meg arról, hogy a
/asyncopciót is belefoglalja.A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.
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ásacímű témakör utasításait.