Compartir a través de


Concurrencia

Download sample

El ejemplo de la Simultaneidad muestra cómo utilizar ServiceBehaviorAttribute con la enumeración ConcurrencyMode, que controla si una instancia de un servicio procesa secuencialmente o simultáneamente los mensajes. El ejemplo se basa en Ejemplo de introducción que implementa el contrato de servicio ICalculator. Este ejemplo define un nuevo contrato, ICalculatorConcurrency, que hereda de ICalculator, proporcionando dos operaciones adicionales para inspeccionar el estado de la simultaneidad del servicio. Modificando el valor de simultaneidad, puede observar el cambio en el comportamiento ejecutando el cliente.

En este ejemplo, el cliente es una aplicación de consola (.exe) e Internet Information Servers (IIS) hospeda 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 concurrencia disponibles:

  • Single: Cada instancia del servicio procesa a la vez un mensaje. Éste es el modo de concurrencia predeterminado.

  • Multiple: Cada instancia del servicio procesa simultáneamente varios mensajes. La implementación del servicio debe ser segura para los subprocesos para utilizar este modo de concurrencia.

  • Reentrant: cada instancia de servicio procesa a la vez un mensaje, pero acepta llamadas reentrantes. El servicio sólo acepta estas llamadas cuando está llamando. El Reentrante se muestra en el ejemplo ConcurrencyMode reentrante.

El uso de concurrencia se relaciona 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. Para crear instanciasSingle, oSingle o la simultaneidad Multiple es pertinente, dependiendo de si la instancia única procesa secuencialmente o simultáneamente los mensajes. Para crear instanciasPerSession, cualquiera de los modos de la simultaneidad puede ser pertinente.

La clase de servicio especifica el comportamiento de la concurrencia con el atributo [ServiceBehavior(ConcurrencyMode=<setting>)] como se muestra en el ejemplo de código que sigue. Cambiando las líneas marcadas con comentarios, se puede experimentar con Single y con los modos de concurrencia Multiple. Recuerde volver a generar 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 concurrencia Multiple con Single que crea instancias de forma predeterminada. El código de cliente se ha modificado para utilizar un proxy asincrónico. Esto permite al cliente realizar varias llamadas al servicio sin esperar por una respuesta entre cada llamada. Puede observar la diferencia en el comportamiento del modo de concurrencia de servicio.

Al ejecutar el ejemplo, las solicitudes y respuestas de la operación se muestran en la ventana de la consola del cliente. Se muestra el modo de la concurrencia en el que el servicio se está ejecutando, se llama a cada operación y, a continuación, se muestra el recuento de la operación. Observe que cuando el modo de la simultaneidad es Multiple, los resultados se devuelven en un orden diferente a como se llamaron, porque el servicio procesa simultáneamente varios mensajes. Cambiando el modo de simultaneidad a Single, los resultados se devuelven en el orden en que se denominaron, porque el servicio procesa secuencialmente cada mensaje. Presione ENTRAR en la ventana de cliente para cerrar el cliente.

Para configurar, generar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado el Procedimiento de instalación único para ejemplos de Windows Communication Foundation.

  2. Para generar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Generación de ejemplos de Windows Communication Foundation.

  3. Para ejecutar el ejemplo en una configuración de equipos única o cruzada, siga las instrucciones de Ejecución de ejemplos de Windows Communication Foundation.

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.