Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Reentrant örneği, bir hizmet uygulamasında ConcurrencyMode.Reentrant kullanmanın gerekliliğini ve etkilerini gösterir. ConcurrencyMode.Reentrant, hizmetin (veya geri çağırmanın) belirli bir anda yalnızca bir iletiyi işlediğini belirtir (benzer şekilde ConcurencyMode.Single). İş parçacığı güvenliğini sağlamak için Windows Communication Foundation (WCF), bir iletiyi işleme sürecini kilitler, böylece başka hiçbir ileti işlenemez. Yeniden Giriş modu söz konusu olduğunda, InstanceContext hizmetin giden bir çağrı yapmasından hemen önce kilidinin açılması, sonraki çağrının (örnekte gösterildiği gibi yeniden girilebilir) hizmete bir sonraki geldiğinde kilidi almasına izin verir. Davranışı göstermek için örnek, istemci ve hizmetin çift yönlü bir sözleşme kullanarak birbirleriyle nasıl ileti gönderebileceğini gösterir.
Tanımlanan sözleşme, hizmet tarafından uygulanan Ping yöntemi ve istemci tarafından uygulanan Pong geri çağırma yöntemi ile çift yönlü bir sözleşmedir. İstemci, sunucunun Ping yöntemini bir sayı sayacını kullanarak çağırır ve böylece çağrıyı başlatır. Hizmet, sayaç değerinin 0'a eşit olmadığını kontrol eder ve ardından tik sayısını azaltarak geri Pong çağırma yöntemini çağırır. Bu, örnekteki aşağıdaki kod tarafından gerçekleştirilir.
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));
}
}
Geri çağırmanın Pong uygulanışı, Ping uygulanışı ile aynı mantığa sahiptir. Başka bir ifadeyle, tik sayısının sıfır olmadığını denetler ve ardından geri çağırma kanalında (bu durumda, özgün Ping mesajı göndermek için kullanılan kanaldır) tik sayısı 1 azaltılmış olarak Ping yöntemini çağırır. Yöntem, sayaç değeri 0'a ulaştığı anda döner ve bu, çağrıyı başlatan istemcinin yaptığı ilk çağrıya kadar tüm yanıtları sarar. Bu, geri çağırma uygulamasında gösterilir.
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));
}
}
Ping ve Pong yöntemleri istek/yanıt tabanlıdır; bu, Ping çağrısı döndürülene kadar ilk CallbackChannel<T>.Pong() çağrısının döndürülmediği anlamına gelir. İstemcide, Pong yöntemi, yaptığı bir sonraki Ping çağrısı dönene kadar döndüremez. Hem geri çağırmanın hem de hizmetin bekleyen isteği yanıtlayabilmesi için önce giden istek/yanıt çağrıları yapması gerektiğinden, her iki uygulamanın da ConcurrencyMode.Reentrant davranışıyla işaretlenmesi gerekir.
Örneği ayarlamak, derlemek ve çalıştırmak için
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.
Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.
Gösterir
Örneği çalıştırmak için istemci ve sunucu projelerini oluşturun. Ardından iki komut penceresi açın ve dizinleri <sample>\CS\Service\bin\debug ve <sample>\CS\Client\bin\debug dizinleriyle değiştirin. Ardından yazarak service.exe hizmeti başlatın ve ardından giriş bağımsız değişkeni olarak geçirilen ilk değer olan onay işaretleriyle Client.exe çağırın. 10 tik için örnek bir çıktı gösterilmektedir.
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