ConcurrencyMode Enumeration
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Gibt an, ob eine Dienstklasse einen Singlethread- oder Multithread-Modus des Vorgangs unterstützt.
public enum class ConcurrencyMode
public enum ConcurrencyMode
type ConcurrencyMode =
Public Enum ConcurrencyMode
- Vererbung
Felder
| Name | Wert | Beschreibung |
|---|---|---|
| Single | 0 | Die Dienstinstanz ist singlethreaded und akzeptiert keine erneuten Aufrufe. Wenn die InstanceContextMode Eigenschaft lautet Singleund zusätzliche Nachrichten eingehen, während die Instanz einen Anruf bedient, müssen diese Nachrichten warten, bis der Dienst verfügbar ist oder bis das Zeitlimit der Nachrichten liegt. |
| Reentrant | 1 | Die Dienstinstanz ist singlethreaded und akzeptiert erneute Aufrufe. Der reentrant-Dienst akzeptiert Anrufe, wenn Sie einen anderen Dienst aufrufen; Daher liegt es in Ihrer Verantwortung, den Objektzustand vor Beschriftungen konsistent zu lassen, und Sie müssen bestätigen, dass betriebslokale Daten nach Beschriftungen gültig sind. Beachten Sie, dass die Dienstinstanz nur durch Aufrufen eines anderen Diensts über einen WCF-Kanal entsperrt wird. In diesem Fall kann der aufgerufene Dienst den ersten Dienst über einen Rückruf erneut aufrufen. Wenn der erste Dienst nicht erneut ausgeführt wird, führt die Abfolge von Aufrufen zu einem Deadlock. Weitere Informationen finden Sie unter ConcurrencyMode. |
| Multiple | 2 | Die Dienstinstanz ist multithreaded. Es werden keine Synchronisierungsgarantien gewährt. Da andere Threads Ihr Dienstobjekt jederzeit ändern können, müssen Sie die Synchronisierungs- und Zustandskonsistenz jederzeit behandeln. |
Beispiele
Das folgende Codebeispiel veranschaulicht die Unterschiede zwischen der Verwendung von Single, Reentrant und Multiple. In diesem Beispiel wird nicht ohne eine echte Implementierung dahinter kompiliert, sondern die Art der Threadinggarantie veranschaulicht, die WCF macht und was dies für Den Vorgangscode bedeutet.
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 singlethreaded- oder multithreaded Modi des Vorgangs unterstützt. Ein Singlethread-Vorgang kann entweder erneut oder nicht erneut ausgeführt werden.
In der folgenden Tabelle wird gezeigt, wann windows Communication Foundation (WCF) es zulässt, dass ein Vorgang aufgerufen wird, während je nach dem ConcurrencyMode.
| ConcurrencyMode-Wert | Kann ein neuer Vorgang aufgerufen werden? |
|---|---|
| Ledig | „Nie“ festgelegt ist. |
| Eintrittsinvariante | Nur beim Aufrufen eines anderen Diensts oder eines Rückrufs. |
| Multiple | Immer. |