Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'esempio di Concorrenza dimostra l'utilizzo di ServiceBehaviorAttribute con l'enumerazione ConcurrencyMode, che controlla se un'istanza di un servizio elabora i messaggi in sequenza o simultaneamente. L'esempio è basato su Getting Started, che implementa il ICalculator contratto di servizio. Questo esempio definisce un nuovo contratto, ICalculatorConcurrency, che eredita da ICalculator, fornendo due operazioni aggiuntive per esaminare lo stato della concorrenza del servizio. Modificando l'impostazione di concorrenza, è possibile osservare la modifica del comportamento eseguendo il client.
In questo esempio il client è un'applicazione console (.exe) e il servizio è ospitato da Internet Information Services (IIS).
Annotazioni
La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.
Sono disponibili tre modalità di concorrenza:
Single: ogni istanza del servizio elabora un messaggio alla volta. Si tratta della modalità di concorrenza predefinita.Multiple: ogni istanza del servizio elabora più messaggi contemporaneamente. L'implementazione del servizio deve essere thread-safe per usare questa modalità di concorrenza.Reentrant: ogni istanza del servizio elabora un messaggio alla volta, ma accetta chiamate reentranti. Il servizio accetta queste chiamate solo quando viene richiamato. Reentrant è illustrato nell'esempio ConcurrencyMode.Reentrant .
L'uso della concorrenza è correlato alla modalità di istanza. Nella PerCall creazione di istanze, la concorrenza non è rilevante, perché ogni messaggio viene elaborato da una nuova istanza del servizio. Nella definizione di istanze, la concorrenza di Single o Single è rilevante, a seconda che la singola istanza elabora i messaggi in sequenza o in parallelo. Nella PerSession creazione di istanze, qualunque modalità di concorrenza può essere rilevante.
La classe del servizio specifica il comportamento di concorrenza con l'attributo [ServiceBehavior(ConcurrencyMode=<setting>)] , come illustrato nell'esempio di codice seguente. Modificando le righe commentate, è possibile sperimentare le modalità di concorrenza Single e Multiple. Ricordarsi di ricostruire il servizio dopo aver modificato la modalità di concorrenza.
// 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;
}
}
L'esempio usa Multiple la concorrenza con Single la creazione di istanze per impostazione predefinita. Il codice client è stato modificato per l'uso di un proxy asincrono. In questo modo il client può effettuare più chiamate al servizio senza attendere una risposta tra ogni chiamata. È possibile osservare la differenza nel comportamento della modalità di concorrenza del servizio.
Quando si esegue l'esempio, le richieste e le risposte dell'operazione vengono visualizzate nella finestra della console client. Viene visualizzata la modalità di concorrenza in cui è in esecuzione il servizio, ogni operazione viene chiamata e quindi viene visualizzato il numero di operazioni. Si noti che quando la modalità di concorrenza è Multiple, i risultati vengono restituiti in un ordine diverso da quello chiamato, perché il servizio elabora più messaggi contemporaneamente. Modificando la modalità Singledi concorrenza in , i risultati vengono restituiti nell'ordine in cui sono stati chiamati, perché il servizio elabora ogni messaggio in sequenza. Premere INVIO nella finestra del client per chiudere il client.
Per configurare, compilare ed eseguire l'esempio
Assicurati di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation.
Se si usa Svcutil.exe per generare il client proxy, assicurarsi di includere l'opzione
/async.Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.
Per eseguire l'esempio in una configurazione con computer singolo o incrociato, seguire le istruzioni riportate in Esecuzione degli esempi di Windows Communication Foundation.