Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sampel Konkurensi menunjukkan penggunaan ServiceBehaviorAttribute dengan ConcurrencyMode enumerasi, yang mengontrol apakah instans layanan memproses pesan secara berurutan atau bersamaan. Sampel ini didasarkan pada panduan Memulai, yang mengimplementasikan ICalculator kontrak layanan. Sampel ini mendefinisikan kontrak baru, ICalculatorConcurrency, yang mewarisi dari ICalculator, menyediakan dua operasi tambahan untuk memeriksa status konkurensi layanan. Dengan mengubah pengaturan konkurensi, Anda dapat mengamati perubahan perilaku dengan menjalankan klien.
Dalam sampel ini, klien adalah aplikasi konsol (.exe) dan layanan dihosting oleh Internet Information Services (IIS).
Nota
Prosedur penyiapan dan instruksi build untuk sampel ini terletak di akhir topik ini.
Ada tiga mode konkurensi yang tersedia:
Single: Setiap instans layanan memproses satu pesan pada satu waktu. Ini adalah mode konkurensi default.Multiple: Setiap instans layanan memproses beberapa pesan secara bersamaan. Implementasi layanan harus aman untuk menggunakan mode konkurensi ini.Reentrant: Setiap instans layanan memproses satu pesan pada satu waktu, tetapi menerima panggilan masuk kembali. Layanan ini hanya menerima panggilan ketika sedang melakukan panggilan keluar. Reentrant ditampilkan dalam sampel ConcurrencyMode.Reentrant.
Penggunaan konkurensi terkait dengan mode instansiasi. Dalam PerCall instancing, kesamaan waktu tidak relevan, karena setiap pesan diproses oleh instans layanan yang baru. Dalam Single instancing, baik Single atau Multiple kesamaan relevan, tergantung pada apakah instans tunggal memproses pesan secara berurutan atau bersamaan. Dalam PerSession instancing, salah satu mode konkurensi mungkin relevan.
Kelas layanan menentukan perilaku konkurensi dengan [ServiceBehavior(ConcurrencyMode=<setting>)] atribut seperti yang ditunjukkan dalam sampel kode berikut. Dengan mengubah baris yang mana yang dikomentari, Anda dapat bereksperimen dengan mode konkurensi Single dan Multiple. Ingatlah untuk membangun kembali layanan setelah mengubah mode konkurensi.
// Single allows a single message to be processed sequentially by each service instance.
//[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]
// Multiple allows concurrent processing of multiple messages by a service instance.
// The service implementation should be thread-safe. This can be used to increase throughput.
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
// Uses Thread.Sleep to vary the execution time of each operation.
public class CalculatorService : ICalculatorConcurrency
{
int operationCount;
public double Add(double n1, double n2)
{
operationCount++;
System.Threading.Thread.Sleep(180);
return n1 + n2;
}
public double Subtract(double n1, double n2)
{
operationCount++;
System.Threading.Thread.Sleep(100);
return n1 - n2;
}
public double Multiply(double n1, double n2)
{
operationCount++;
System.Threading.Thread.Sleep(150);
return n1 * n2;
}
public double Divide(double n1, double n2)
{
operationCount++;
System.Threading.Thread.Sleep(120);
return n1 / n2;
}
public string GetConcurrencyMode()
{
// Return the ConcurrencyMode of the service.
ServiceHost host = (ServiceHost)OperationContext.Current.Host;
ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
return behavior.ConcurrencyMode.ToString();
}
public int GetOperationCount()
{
// Return the number of operations.
return operationCount;
}
}
Contoh menggunakan Multiple concurrency dengan Single instancing secara bawaan. Kode klien telah dimodifikasi untuk menggunakan proksi asinkron. Ini memungkinkan klien untuk melakukan beberapa panggilan ke layanan tanpa menunggu respons antara setiap panggilan. Anda dapat mengamati perbedaan perilaku mode konkurensi layanan.
Saat Anda menjalankan sampel, permintaan dan respons operasi ditampilkan di jendela konsol klien. Mode konkurensi tempat layanan berjalan ditampilkan, setiap operasi dipanggil, lalu jumlah operasi ditampilkan. Perhatikan bahwa ketika mode konkurensi adalah Multiple, hasilnya dikembalikan dalam urutan yang berbeda dari cara mereka dipanggil, karena layanan memproses beberapa pesan secara bersamaan. Dengan mengubah mode konkurensi menjadi Single, hasilnya dikembalikan dalam urutan yang dipanggil, karena layanan memproses setiap pesan secara berurutan. Tekan ENTER di jendela klien untuk mematikan klien.
Untuk menyiapkan, mengompilasi, dan menjalankan sampel
Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.
Jika Anda menggunakan Svcutil.exe untuk menghasilkan klien proksi, pastikan Anda menyertakan opsi .
/asyncUntuk membangun solusi edisi C# atau Visual Basic .NET, ikuti instruksi di Membangun Sampel Windows Communication Foundation.
Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi di Menjalankan Sampel Windows Communication Foundation.