ParallelitätConcurrency

Das Parallelitätsbeispiel veranschaulicht die Verwendung des ServiceBehaviorAttribute mit der ConcurrencyMode-Enumeration, die steuert, ob eine Instanz eines Diensts Nachrichten sequenziell oder parallel verarbeitet.The Concurrency sample demonstrates using the ServiceBehaviorAttribute with the ConcurrencyMode enumeration, which controls whether an instance of a service processes messages sequentially or concurrently. Das Beispiel basiert auf der Einstieg, implementiert die ICalculator Dienstvertrag.The sample is based on the Getting Started, which implements the ICalculator service contract. Dieses Beispiel definiert einen neuen Vertrag, ICalculatorConcurrency, der von ICalculator erbt und zwei zusätzliche Vorgänge für die Überwachung des Status der Dienstparallelität bereitstellt.This sample defines a new contract, ICalculatorConcurrency, which inherits from ICalculator, providing two additional operations for inspecting the state of the service concurrency. Indem Sie die Einstellung für die Parallelität ändern, können Sie Änderungen im Verhalten beobachten, wenn Sie den Client ausführen.By altering the concurrency setting, you can observe the change in behavior by running the client.

In diesem Beispiel ist der Client eine Konsolenanwendung (.exe), und der Dienst wird von IIS (Internet Information Services, Internetinformationsdienste) gehostet.In this sample, the client is a console application (.exe) and the service is hosted by Internet Information Services (IIS).

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Es stehen drei Parallelitätsmodi zur Verfügung:There are three concurrency modes available:

  • Single: Jede Dienstinstanz verarbeitet jeweils nur eine Nachricht.Single: Each service instance processes one message at a time. Dies ist der Standardparallelitätsmodus.This is the default concurrency mode.

  • Multiple: Jede Dienstinstanz verarbeitet mehrere Nachrichten gleichzeitig.Multiple: Each service instance processes multiple messages concurrently. Für diesen Parallelitätsmodus muss die Dienstimplementierung threadsicher sein.The service implementation must be thread-safe to use this concurrency mode.

  • Reentrant: Jede Dienstinstanz verarbeitet jeweils nur eine Nachricht, akzeptiert jedoch eintrittsvariante Aufrufe.Reentrant: Each service instance processes one message at a time, but accepts reentrant calls. Der Dienst akzeptiert diese Aufrufe nur bei ausgehenden Aufrufen. Reentrant wird veranschaulicht, der ConcurrencyMode.Reentrant Beispiel.The service only accepts these calls when it is calling out. Reentrant is demonstrated in the ConcurrencyMode.Reentrant sample.

Die Parallelität steht mit dem Instanziierungsmodus in Beziehung.The use of concurrency is related to the instancing mode. In der PerCall-Instanziierung ist Parallelität nicht relevant, da jede Nachricht von einer neuen Dienstinstanz verarbeitet wird.In PerCall instancing, concurrency is not relevant, because each message is processed by a new service instance. In der Single-Instanziierung ist entweder die Single- oder die Multiple-Parallelität relevant, je nachdem, ob die einzelne Instanz Nachrichten sequenziell oder parallel verarbeitet.In Single instancing, either Single or Multiple concurrency is relevant, depending on whether the single instance processes messages sequentially or concurrently. In der PerSession-Instanziierung sind möglicherweise alle Parallelitätsmodi relevant.In PerSession instancing, any of the concurrency modes may be relevant.

Die Dienstklasse gibt das Parallelitätsverhalten mit dem [ServiceBehavior(ConcurrencyMode=<setting>)]-Attribut an, wie im folgenden Beispielcode dargestellt.The service class specifies concurrency behavior with the [ServiceBehavior(ConcurrencyMode=<setting>)] attribute as shown in the code sample that follows. Durch wechselndes Auskommentieren der Zeilen können Sie mit den Parallelitätsmodi Single und Multiple experimentieren.By changing which lines are commented out, you can experiment with the Single and Multiple concurrency modes. Denken Sie daran, den Dienst nach dem Ändern des Parallelitätsmodus neu zu erstellen.Remember to rebuild the service after changing the concurrency mode.

// 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;  
    }  
}  

Im Beispiel wird standardmäßig die Multiple-Parallelität mit der Single-Instanziierung verwendet.The sample uses Multiple concurrency with Single instancing by default. Der Clientcode wurde geändert, um einen asynchronen Proxy zu verwenden.The client code has been modified to use an asynchronous proxy. Auf diese Weise kann der Client mehrere Aufrufe an den Dienst ausführen, ohne zwischen den Aufrufen auf eine Antwort zu warten.This allows the client to make multiple calls to the service without waiting for a response between each call. Sie können das unterschiedliche Verhalten des Dienstparallelitätsmodus beobachten.You can observe the difference in behavior of the service concurrency mode.

Wenn Sie das Beispiel ausführen, werden die Anforderungen und Antworten für den Vorgang im Clientkonsolenfenster angezeigt.When you run the sample, the operation requests and responses are displayed in the client console window. Der vom Dienst ausgeführte Parallelitätsmodus wird angezeigt, jeder Vorgang wird aufgerufen, und anschließend wird die Anzahl der Vorgänge angezeigt.The concurrency mode that the service is running under is displayed, each operation is called, and then the operation count is displayed. Beachten Sie, dass die Ergebnisse in einer anderen Reihenfolge als in der zurückgeben werden, in der sie aufgerufen wurden, wenn der Parallelitätsmodus Multiple ist, da der Dienst mehrere Nachrichten gleichzeitig verarbeitet.Notice that when the concurrency mode is Multiple, the results are returned in a different order than how they were called, because the service processes multiple messages concurrently. Wenn der Parallelitätsmodus zu Single geändert wird, werden die Ergebnisse in der Reihenfolge zurückgegeben, in der sie aufgerufen wurden, da alle Nachrichten sequenziell verarbeitet werden.By changing the concurrency mode to Single, the results are returned in the order they were called, because the service processes each message sequentially. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.Press ENTER in the client window to shut down the client.

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Wenn Sie Svcutil.exe zum Generieren des Proxyclients verwenden, stellen Sie sicher, dass Sie enthalten die /async Option.If you use Svcutil.exe to generate the proxy client, ensure that you include the /async option.

  3. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  4. Um das Beispiel in einer einzelnen oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Services\Behaviors\Concurrency

Siehe auchSee Also