Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W przykładzie Reentrant przedstawiono konieczność i implikacje korzystania z funkcji ConcurrencyMode.Reentrant w implementacji usługi. ConcurrencyMode.Reentrant oznacza, że usługa (lub wywołanie zwrotne) przetwarza tylko jeden komunikat w danym momencie (analogiczny do ConcurencyMode.Single
). Aby zapewnić bezpieczeństwo wątków, program Windows Communication Foundation (WCF) blokuje przetwarzanie komunikatu InstanceContext
, aby nie można było przetworzyć żadnych innych komunikatów. W przypadku trybu reentrant InstanceContext
jest odblokowywane tuż przed tym, jak usługa wykonuje wywołanie wychodzące, co pozwala kolejnemu wywołaniu (które może być reentrant, jak pokazano w przykładzie) uzyskać blokadę, gdy następnym razem wejdzie do usługi. Aby zademonstrować zachowanie, w przykładzie pokazano, jak klient i usługa mogą wysyłać komunikaty między sobą przy użyciu kontraktu dwustronnego.
Zdefiniowany kontrakt jest kontraktem dupleksowym, z metodą Ping
implementowaną przez usługę i metodą wywołania zwrotnego Pong
implementowaną przez klienta. Klient wywołuje metodę serwera Ping
z liczbą odliczeń, tym samym inicjując połączenie. Usługa sprawdza, czy liczba znaczników nie jest równa 0, a następnie wywołuje metodę wywołań zwrotnych Pong
podczas dekrementacji liczby znaczników. Jest to wykonywane za pomocą następującego kodu w przykładzie.
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));
}
}
Implementacja wywołania zwrotnego Pong
ma taką samą logikę jak implementacja Ping
. Oznacza to, że sprawdza, czy liczba znaczników nie jest równa zero, a następnie wywołuje metodę Ping
na kanale wywołania zwrotnego (w tym przypadku jest to kanał, który został użyty do wysłania oryginalnego komunikatu Ping
) z liczbą znaczników pomniejszoną o 1. Gdy licznik osiągnie wartość 0, metoda zwraca wartość, rozpakowując w ten sposób wszystkie odpowiedzi z powrotem do pierwszego wywołania zainicjowanego przez klienta. Jest to wyświetlane w implementacji wywołania zwrotnego.
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));
}
}
Obie metody Ping
i Pong
to żądanie/odpowiedź, co oznacza, że pierwsze wywołanie Ping
nie zwraca się do momentu zwrócenia wywołania CallbackChannel<T>.Pong()
. Na kliencie Pong
metoda nie może powrócić do momentu następnego Ping
wywołania, które dokonało zwrotów. Ponieważ zarówno wywołanie zwrotne, jak i usługa muszą wysyłać wychodzące żądania/odpowiedzi, zanim będą mogły odpowiedzieć na oczekujące żądanie, obie implementacje muszą być oznaczone zachowaniem ConcurrencyMode.Reentrant.
Aby skonfigurować, skompilować i uruchomić przykładowy program
Upewnij się, że wykonano procedurę instalacji One-Time dla przykładów programu Windows Communication Foundation.
Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w Kompilowanie przykładów Windows Communication Foundation.
Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w Uruchamianie przykładów programu Windows Communication Foundation.
Demonstruje
Aby uruchomić przykład, skompiluj projekty klienta i serwera. Następnie otwórz dwa okna poleceń i zmień katalogi na <sample>\CS\Service\bin\debug i <sample>\CS\Client\bin\debug. Następnie uruchom usługę, wpisując service.exe
, a następnie wywołaj Client.exe z początkową liczbą tików przekazaną jako argument wejściowy. Wyświetlane są przykładowe dane wyjściowe dla 10 znaczników.
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