Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O exemplo de concorrência demonstra o uso do ServiceBehaviorAttribute com a enumeração ConcurrencyMode, que controla se uma instância de um serviço processa mensagens sequencialmente ou concorrentemente. O exemplo é baseado no Guia de Início, que implementa o contrato de serviço ICalculator. Este exemplo define um novo contrato, ICalculatorConcurrency, que herda de ICalculator, fornecendo duas operações adicionais para inspecionar o estado da simultaneidade do serviço. Ao alterar a configuração de simultaneidade, você pode observar a mudança no comportamento executando o cliente.
Neste exemplo, o cliente é um aplicativo de console (.exe) e o serviço é hospedado pelo IIS (Serviços de Informações da Internet).
Observação
O procedimento de configuração e as instruções de compilação para este exemplo estão localizados no final deste tópico.
Há três modos de simultaneidade disponíveis:
Single: Cada instância de serviço processa uma mensagem de cada vez. Este é o modo de simultaneidade padrão.Multiple: Cada instância de serviço processa várias mensagens simultaneamente. A implementação do serviço deve ser thread-safe para usar esse modo de simultaneidade.Reentrant: Cada instância de serviço processa uma mensagem de cada vez, mas aceita chamadas reentrantes. O serviço só aceita essas chamadas quando está chamando. O reentrante é demonstrado no exemplo ConcurrencyMode.Reentrant .
O uso da simultaneidade está relacionado ao modo de instanciação. No PerCall instancing, a simultaneidade não é relevante, porque cada mensagem é processada por uma nova instância de serviço. No Single instancing, uma ou outra SingleMultiple simultaneidade é relevante, dependendo se a instância única processa mensagens sequencialmente ou simultaneamente. No PerSession instancing, qualquer um dos modos de simultaneidade pode ser relevante.
A classe service especifica o comportamento de simultaneidade com o [ServiceBehavior(ConcurrencyMode=<setting>)] atributo conforme mostrado no exemplo de código a seguir. Ao alterar quais linhas estão descomentadas, pode-se experimentar os modos de simultaneidade Single e Multiple. Lembre-se de reconstruir o serviço depois de alterar o modo de concorrência.
// 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;
}
}
O exemplo usa Multiple simultaneidade com Single instanciação por padrão. O código do cliente foi modificado para usar um proxy assíncrono. Isso permite que o cliente faça várias chamadas para o serviço sem esperar por uma resposta entre cada chamada. Você pode observar a diferença no comportamento do modo de simultaneidade do serviço.
Quando você executa o exemplo, as solicitações de operação e as respostas são exibidas na janela do console do cliente. O modo de simultaneidade em que o serviço está sendo executado é exibido, cada operação é chamada e, em seguida, a contagem de operações é exibida. Observe que, quando o modo de simultaneidade é Multiple, os resultados são retornados em uma ordem diferente de como foram chamados, porque o serviço processa várias mensagens simultaneamente. Ao alterar o modo de simultaneidade para Single, os resultados são retornados na ordem em que foram chamados, porque o serviço processa cada mensagem sequencialmente. Pressione ENTER na janela do cliente para desligar o cliente.
Para configurar, compilar e executar o exemplo
Verifique se você executou o procedimento de instalação do One-Time para os exemplos do Windows Communication Foundation.
Se você usar Svcutil.exe para gerar o cliente proxy, certifique-se de incluir a
/asyncopção.Para criar a edição C# ou Visual Basic .NET da solução, siga as instruções em Criando os exemplos do Windows Communication Foundation.
Para executar o exemplo em uma configuração de máquina única ou cruzada, siga as instruções em Executando os exemplos do Windows Communication Foundation.