Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das Reentrant-Beispiel veranschaulicht die Notwendigkeit und Auswirkungen der Verwendung von ConcurrencyMode.Reentrant für eine Dienstimplementierung. ConcurrencyMode.Reentrant impliziert, dass der Dienst (oder Rückruf) nur eine Nachricht zu einem bestimmten Zeitpunkt verarbeitet (analog zu ConcurencyMode.Single). Um die Threadsicherheit sicherzustellen, sperrt Windows Communication Foundation (WCF) die InstanceContext Verarbeitung einer Nachricht, sodass keine anderen Nachrichten verarbeitet werden können. Im Reentrant-Modus wird der InstanceContext entsperrt, kurz bevor der Dienst einen ausgehenden Aufruf ausführt. So kann der folgende Aufruf (der wie in diesem Beispiel dargestellt wiedereintrittsfähig sein kann) beim nächsten Mal gesperrt werden, wenn er den Dienst erreicht. Um das Verhalten zu veranschaulichen, zeigt das Beispiel, wie ein Client und ein Dienst Nachrichten über einen Duplex-Vertrag miteinander senden können.
Der definierte Vertrag ist ein Duplexvertrag mit der Ping vom Dienst implementierten Methode und der Callback-Methode Pong, die vom Client implementiert wird. Ein Client ruft die Ping-Methode des Servers mit einer Tickanzahl auf und initiiert so den Aufruf. Der Dienst überprüft, ob die Teilstrichanzahl nicht gleich 0 ist, und ruft dann die Rückrufmethode Pong auf, während die Teilstrichanzahl verringert wird. Dies erfolgt durch den folgenden Code im Beispiel.
public void Ping(int ticks)
{
Console.WriteLine("Ping: Ticks = " + ticks);
//Keep pinging back and forth till Ticks reaches 0.
if (ticks != 0)
{
OperationContext.Current.GetCallbackChannel<IPingPongCallback>().Pong((ticks - 1));
}
}
Die Implementierung der Callback-Funktion Pong hat die gleiche Logik wie die Implementierung von Ping. Das heißt, es überprüft, ob die Tickanzahl nicht null ist, und ruft dann die Ping Methode für den Rückrufkanal auf (in diesem Fall ist es der Kanal, der zum Senden der ursprünglichen Ping Nachricht verwendet wurde), wobei die Tickanzahl um 1 verringert wurde. Wenn die Anzahl der Ticks 0 erreicht, kehrt die Methode zurück und entpackt dabei alle Antworten auf den ersten Aufruf, der vom Client getätigt wurde, der den Aufruf initiiert hat. Dies wird in der Rückrufimplementierung angezeigt.
public void Pong(int ticks)
{
Console.WriteLine("Pong: Ticks = " + ticks);
if (ticks != 0)
{
//Retrieve the Callback Channel (in this case the Channel which was used to send the
//original message) and make an outgoing call until ticks reaches 0.
IPingPong channel = OperationContext.Current.GetCallbackChannel<IPingPong>();
channel.Ping((ticks - 1));
}
}
Die Ping-Methode und die Pong-Methode sind Anforderung/Antwort-Methoden. Der erste Aufruf von Ping wird daher erst zurückgegeben, wenn der Aufruf von CallbackChannel<T>.Pong() zurückgegeben wurde. Auf dem Client kann die Pong-Methode erst zurückgegeben werden, wenn der nächste Ping-Aufruf, den sie vorgenommen hat, zurückgegeben wurde. Da sowohl der Rückruf als auch der Dienst ausgehende Anforderungs-/Antwortaufrufe ausführen müssen, bevor sie für die ausstehende Anforderung antworten können, müssen beide Implementierungen mit dem Verhalten "ConcurrencyMode.Reentrant" gekennzeichnet werden.
So können Sie das Beispiel einrichten, erstellen und ausführen
Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.
Um die C#- oder Visual Basic .NET-Edition der Lösung zu erstellen, befolgen Sie die Anweisungen in Building the Windows Communication Foundation Samples.
Wenn Sie das Beispiel in einer Konfiguration mit einem Computer oder über Computer hinweg ausführen möchten, folgen Sie den Anweisungen unter Durchführen der Windows Communication Foundation-Beispiele.
Zeigt
Um das Beispiel auszuführen, erstellen Sie die Client- und Serverprojekte. Öffnen Sie dann zwei Befehlsfenster, und ändern Sie die Verzeichnisse in die <Verzeichnisse "sample>\CS\Service\bin\debug" und <"sample>\CS\Client\bin\debug". Starten Sie danach den Dienst, indem Sie service.exe eingeben. Rufen Sie dann „Client.exe“ auf, und übergeben Sie den Anfangswert für die Tickanzahl als Eingabeargument. Es wird eine Beispielausgabe für 10 Ticks veranschaulicht.
Prompt>Service.exe
ServiceHost Started. Press Enter to terminate service.
Ping: Ticks = 10
Ping: Ticks = 8
Ping: Ticks = 6
Ping: Ticks = 4
Ping: Ticks = 2
Ping: Ticks = 0
Prompt>Client.exe 10
Pong: Ticks = 9
Pong: Ticks = 7
Pong: Ticks = 5
Pong: Ticks = 3
Pong: Ticks = 1