Bagikan melalui


ConcurrencyMode Reentrant

Sampel Reentrant menunjukkan kebutuhan dan implikasi penggunaan ConcurrencyMode.Reentrant pada implementasi layanan. ConcurrencyMode.Reentrant menyiratkan bahwa layanan (atau panggilan balik) hanya memproses satu pesan pada waktu tertentu (dianalogikan dengan ConcurencyMode.Single). Untuk memastikan keamanan utas, Windows Communication Foundation (WCF) mengunci InstanceContext memroses pesan sehingga tidak ada pesan lain yang dapat diproses. Dalam kasus mode Reentrant, InstanceContext dibuka kuncinya tepat sebelum layanan melakukan panggilan keluar sehingga memungkinkan panggilan berikutnya, (yang dapat dimasukkan kembali seperti yang ditunjukkan dalam sampel) untuk mendapatkan kunci saat berikutnya masuk ke layanan. Untuk menunjukkan perilaku, sampel menunjukkan bagaimana klien dan layanan dapat mengirim pesan antara satu sama lain menggunakan kontrak dupleks.

Kontrak yang ditentukan adalah kontrak dupleks dengan metode Ping yang diimplementasikan oleh layanan dan metode panggilan balik Pong yang diimplementasikan oleh klien. Klien memanggil metode Ping server dengan jumlah centang hingga memulai panggilan. Layanan memeriksa apakah jumlah centang tidak sama dengan 0 dan kemudian memanggil panggilan balik metode Pong saat mengurangi jumlah centang. Langkah ini dilakukan oleh kode berikut dalam sampel.

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));
     }
}

Implementasi Pong pada panggilan balik memiliki logika yang sama dengan implementasi Ping. Artinya, langkah ini memeriksa apakah jumlah centang bukan nol dan kemudian memanggil metode Ping pada saluran panggilan balik (dalam hal ini, itu adalah saluran yang digunakan untuk mengirim pesan asli Ping) dengan jumlah centang yang diturunkan sebesar 1. Saat jumlah centang mencapai 0, metode kembali membongkar semua balasan kembali ke panggilan pertama yang dilakukan oleh klien yang memulai panggilan. Ini ditunjukkan dalam implementasi panggilan balik.

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));
    }
}

Metode Ping dan Pong adalah permintaan/balasan, yang berarti bahwa panggilan pertama untuk Ping tidak kembali sampai panggilan untuk CallbackChannel<T>.Pong() kembali. Pada klien, metode Pong tidak dapat kembali sampai panggilan Ping berikut yang dibuatnya kembali. Karena panggilan balik dan layanan harus melakukan panggilan permintaan/balasan keluar sebelum mereka dapat membalas permintaan yang tertunda, kedua implementasi harus ditandai dengan perilaku ConcurrencyMode.Reentrant.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.

Menunjukkan

Untuk menjalankan sampel, buat proyek klien dan server. Kemudian buka dua jendela perintah dan ubah direktori ke <sample>\CS\Service\bin\debug dan <sample>\CS\Client\bin\debug. Kemudian mulai layanan dengan mengetik service.exe lalu panggil Client.exe dengan nilai awal centang yang diteruskan sebagai argumen input. Sampel output untuk 10 centang ditampilkan.

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