Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El ejemplo de simultaneidad muestra el uso de ServiceBehaviorAttribute con la enumeración ConcurrencyMode, que controla si una instancia de un servicio procesa, de forma secuencial o simultánea, los mensajes. La muestra se basa en Primeros pasos, que implementa el contrato de servicio ICalculator. En este ejemplo se define un nuevo contrato, , ICalculatorConcurrencyque hereda de ICalculator, proporcionando dos operaciones adicionales para inspeccionar el estado de la simultaneidad del servicio. Al modificar la configuración de simultaneidad, puede observar el cambio de comportamiento ejecutando el cliente.
En este ejemplo, el cliente es una aplicación de consola (.exe) y los Servicios de Internet Information Server (IIS) hospedan el servicio.
Nota:
El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.
Hay tres modos de simultaneidad disponibles:
Single: cada instancia de servicio procesa un mensaje cada vez. Este es el modo de simultaneidad predeterminado.Multiple: cada instancia de servicio procesa varios mensajes simultáneamente. La implementación del servicio debe ser segura para los subprocesos para utilizar este modo de simultaneidad.Reentrant: cada instancia de servicio procesa un mensaje cada vez, pero acepta llamadas reentrantes. El servicio solo acepta estas llamadas cuando está llamando. El funcionamiento de Reentrant se demuestra en el ejemplo ConcurrencyMode.Reentrant.
El uso de la simultaneidad está relacionado con el modo de creación de instancias. Para crear instanciasPerCall, la simultaneidad no es pertinente, porque una nueva instancia del servicio procesa cada mensaje. En la creación de instancias Single, la concurrencia de Single o Multiple es relevante, dependiendo de si la instancia única procesa los mensajes de forma secuencial o simultánea. Para crear instanciasPerSession, cualquiera de los modos de la simultaneidad puede ser pertinente.
La clase de servicio especifica el comportamiento de simultaneidad con el [ServiceBehavior(ConcurrencyMode=<setting>)] atributo como se muestra en el ejemplo de código siguiente. Cambiando las líneas marcadas con comentarios, se puede experimentar con Single y con los modos de simultaneidad Multiple. Recuerde recompilar el servicio después de cambiar el modo de la simultaneidad.
// 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;
}
}
El ejemplo utiliza la simultaneidad Multiple con Single que crea instancias de forma predeterminada. El código de cliente se ha modificado para usar un proxy asincrónico. Esto permite al cliente realizar varias llamadas al servicio sin esperar una respuesta entre cada llamada. Puede observar la diferencia en el comportamiento del modo de simultaneidad del servicio.
Al ejecutar el ejemplo, las solicitudes de operación y las respuestas se muestran en la ventana de la consola del cliente. Se muestra el modo de simultaneidad en el que se ejecuta el servicio, se llama a cada operación y, a continuación, se muestra el recuento de operaciones. Observe que cuando el modo de simultaneidad es Multiple, los resultados se devuelven en un orden diferente al de cómo se llamó, ya que el servicio procesa varios mensajes simultáneamente. Al cambiar el modo de simultaneidad a Single, los resultados se devuelven en el orden en que se llamaron, ya que el servicio procesa cada mensaje secuencialmente. Presione ENTRAR en la ventana del cliente para apagar el cliente.
Para configurar, compilar y ejecutar el ejemplo
Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
Si usa Svcutil.exe para generar el cliente proxy, asegúrese de incluir la
/asyncopción .Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.
Para ejecutar el ejemplo en una configuración de una máquina única o entre máquinas, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.