ConcurrencyMode ConcurrencyMode ConcurrencyMode ConcurrencyMode Enum

Definition

Gibt an, ob eine Dienstklasse den Singlethread- oder den Multithread-Betriebsmodus unterstützt.Specifies whether a service class supports single-threaded or multi-threaded modes of operation.

public enum class ConcurrencyMode
public enum ConcurrencyMode
type ConcurrencyMode = 
Public Enum ConcurrencyMode
Vererbung
ConcurrencyModeConcurrencyModeConcurrencyModeConcurrencyMode

Felder

Multiple Multiple Multiple Multiple 2

Diese Dienstinstanz ist eine Multithread-Instanz.The service instance is multi-threaded. Es werden keine Synchronisierungsgarantien gegeben.No synchronization guarantees are made. Da andere Threads jederzeit das Dienstobjekt ändern können, müssen Sie die Synchronisierung und die Zustandskonsistenz ständig verarbeiten.Because other threads can change your service object at any time, you must handle synchronization and state consistency at all times.

Reentrant Reentrant Reentrant Reentrant 1

Die Dienstinstanz ist eine Singlethread-Instanz und nimmt wiedereintrittsfähige Aufrufe an.The service instance is single-threaded and accepts reentrant calls. Der wiedereintrittsfähige Dienst nimmt Aufrufe an, wenn Sie einen anderen Dienst aufrufen. Sie sind daher verantwortlich dafür, den Objektzustand vor Aufrufen konsistent zu lassen, und Sie müssen bestätigen, dass lokale Operationsdaten nach Aufrufen gültig sind.The reentrant service accepts calls when you call another service; it is therefore your responsibility to leave your object state consistent before callouts and you must confirm that operation-local data is valid after callouts. Beachten Sie, dass die Dienstinstanz nur durch das Aufrufen eines anderen Diensts über einen WCF-Kanal entsperrt wird.Note that the service instance is unlocked only by calling another service over a WCF channel. In diesem Fall kann der aufgerufene Dienst über einen Rückruf wieder in den ersten Dienst eintreten.In this case, the called service can reenter the first service via a callback. Wenn der erste Dienst nicht wiedereintrittsfähig ist, führt die Sequenz der Aufrufe zu einem Deadlock.If the first service is not reentrant, the sequence of calls results in a deadlock. Ausführliche Informationen finden Sie unter ConcurrencyMode.For details, see ConcurrencyMode.

Single Single Single Single 0

Die Dienstinstanz ist eine Singlethread-Instanz und nimmt keine wiedereintrittsfähige Aufrufe an.The service instance is single-threaded and does not accept reentrant calls. Wenn die InstanceContextMode-Eigenschaft Single ist und weitere Meldungen ankommen, während die Instanz einen Aufruf bedient, müssen diese Meldungen warten, bis der Dienst verfügbar ist oder bis eine Zeitüberschreitung bei den Meldungen eintritt.If the InstanceContextMode property is Single, and additional messages arrive while the instance services a call, these messages must wait until the service is available or until the messages time out.

Beispiele

Das folgende Codebeispiel veranschaulicht den Unterschied zwischen der Verwendung von Reentrant, einzelne und mehrere.The following code example demonstrates the different between using Single, Reentrant, and Multiple. In diesem Beispiel wird die Art der threadinggarantien wird sichergestellt, dass WCF macht und das bedeutet für den Vorgangscode verdeutlicht jedoch nicht ohne hinter einer echten Implementierung kompiliert.This sample does not compile without a real implementation behind it, but does demonstrate the kind of threading guarantees that WCF makes and what that means for your operation code.

using System;
using System.ServiceModel;

[ServiceContract]
public interface IHttpFetcher
{
  [OperationContract]
  string GetWebPage(string address);
}

// These classes have the invariant that:
//     this.slow.GetWebPage(this.cachedAddress) == this.cachedWebPage.
// When you read cached values you can assume they are valid. When
// you write the cached values, you must guarantee that they are valid.
// With ConcurrencyMode.Single, WCF does not call again into the object
// so long as the method is running. After the operation returns the object
// can be called again, so you must make sure state is consistent before
// returning.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)]
class SingleCachingHttpFetcher : IHttpFetcher
{
    string cachedWebPage;
    string cachedAddress;
    readonly IHttpFetcher slow;

    public string GetWebPage(string address)
    {
        // <-- Can assume cache is valid.
        if (this.cachedAddress == address)
        {
            return this.cachedWebPage;
        }

        // <-- Cache is no longer valid because we are changing
        // one of the values.
        this.cachedAddress = address;
        string webPage = slow.GetWebPage(address);
        this.cachedWebPage = webPage;
        // <-- Cache is valid again here.

        return this.cachedWebPage;
        // <-- Must guarantee that the cache is valid because we are returning.
    }
}

// With ConcurrencyMode.Reentrant, WCF makes sure that only one
// thread runs in your code at a time. However, when you call out on a
// channel, the operation can get called again on another thread. Therefore 
// you must confirm that state is consistent both before channel calls and
// before you return.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
class ReentrantCachingHttpFetcher : IHttpFetcher
{
  string cachedWebPage;
  string cachedAddress;
  readonly SlowHttpFetcher slow;

  public ReentrantCachingHttpFetcher()
  {
    this.slow = new SlowHttpFetcher();
  }

  public string GetWebPage(string address)
  {
    // <-- Can assume that cache is valid.
    if (this.cachedAddress == address)
    {
        return this.cachedWebPage;
    }

    // <-- Must guarantee that the cache is valid, because 
    // the operation can be called again before we return.
    string webPage = slow.GetWebPage(address);
    // <-- Can assume cache is valid.

    // <-- Cache is no longer valid because we are changing
    // one of the values.
    this.cachedAddress = address;
    this.cachedWebPage = webPage;
    // <-- Cache is valid again here.

    return this.cachedWebPage;
    // <-- Must guarantee that cache is valid because we are returning.
  }
}

// With ConcurrencyMode.Multiple, threads can call an operation at any time.  
// It is your responsibility to guard your state with locks. If
// you always guarantee you leave state consistent when you leave
// the lock, you can assume it is valid when you enter the lock.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
class MultipleCachingHttpFetcher : IHttpFetcher
{
  string cachedWebPage;
  string cachedAddress;
  readonly SlowHttpFetcher slow;
  readonly object ThisLock = new object();

  public MultipleCachingHttpFetcher()
  {
    this.slow = new SlowHttpFetcher();
  }

  public string GetWebPage(string address)
  {
    lock (this.ThisLock)
    {
      // <-- Can assume cache is valid.
      if (this.cachedAddress == address)
      {
          return this.cachedWebPage;
          // <-- Must guarantee that cache is valid because 
          // the operation returns and releases the lock.
      }
      // <-- Must guarantee that cache is valid here because
      // the operation releases the lock.
    }

    string webPage = slow.GetWebPage(address);

    lock (this.ThisLock)
    {
      // <-- Can assume cache is valid.

      // <-- Cache is no longer valid because the operation 
      // changes one of the values.
      this.cachedAddress = address;
      this.cachedWebPage = webPage;
      // <-- Cache is valid again here.

      // <-- Must guarantee that cache is valid because
      // the operation releases the lock.
    }

    return webPage;
  }
}

Hinweise

ConcurrencyMode wird in Verbindung mit der ConcurrencyMode-Eigenschaft verwendet, um anzugeben, ob eine Dienstklasse den Singlethread- oder den Multithread-Betriebsmodus unterstützt.ConcurrencyMode is used in conjunction with the ConcurrencyMode property to specify whether a service class supports single-threaded or multi-threaded modes of operation. Ein Singlethread-Betrieb kann wiedereintrittsfähig oder nicht wiedereintrittsfähig sein.A single-threaded operation can be either reentrant or non-reentrant.

Die folgende Tabelle zeigt, wenn Windows Communication Foundation (WCF) Aufruf einer Operation zulässt, während eine andere Operation ausgeführt wird, abhängig von der ConcurrencyMode.The following table shows when Windows Communication Foundation (WCF) permits an operation to be invoked while another one is in progress, depending upon the ConcurrencyMode.

Parallelitätsmodus-WertConcurrencyMode Value Kann eine neue Operation aufgerufen werden?Can a new operation be invoked?
SingleSingle NieNever.
ReentrantReentrant Nur, wenn ein anderer Dienst oder ein Rückruf aufgerufen wirdOnly while invoking another service or a callback.
MehrereMultiple ImmerAlways.

Gilt für: