Bagikan melalui


Konkurensi

Sampel Konkurensi menunjukkan penggunaan ServiceBehaviorAttribute dengan enumerasi ConcurrencyMode, yang mengontrol apakah instans layanan memproses pesan secara berurutan atau bersamaan. Sampel didasarkan pada Memulai, yang mengimplementasikan kontrak layanan ICalculator. Sampel ini mendefinisikan kontrak baru, ICalculatorConcurrency, yang mewarisi dari ICalculator, menyediakan dua operasi tambahan untuk memeriksa status konkurensi layanan. Dengan mengubah setelan pembuatan konkurensi, Anda dapat mengamati perubahan perilaku dengan menjalankan klien.

Dalam sampel ini, klien adalah aplikasi konsol (.exe) dan layanan di-hosting oleh Layanan Informasi Internet (IIS).

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Ada tiga mode konkurensi yang tersedia:

  • Single: Setiap instans layanan memproses satu pesan pada satu waktu. Langkah 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 re-entrant. Layanan hanya menerima panggilan ini ketika memanggil. Reentrant ditunjukkan dalam sampel ConcurrencyMode.Reentrant.

Penggunaan konkurensi terkait dengan mode instancing. Dalam instancing PerCall, konkurensi tidak relevan, karena setiap pesan diproses oleh instans layanan baru. Dalam instancing Single, baik konkurensi Single atau Multiple relevan, tergantung pada apakah instans tunggal memproses pesan secara berurutan atau bersamaan. Dalam instancing PerSession, salah satu mode konkurensi mungkin relevan.

Kelas layanan menentukan perilaku pembuatan instans dengan atribut [ServiceBehavior(ConcurrencyMode=<setting>)] seperti yang ditunjukkan dalam sampel kode yang mengikutinya. Dengan mengubah baris mana yang dikomentari, Anda dapat bereksperimen dengan mode konkurensi Single dan Multiple. Jangan lupa untuk membangun kembali layanan setelah mengubah mode pembuatan 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;
    }
}

Sampel menggunakan konkurensi Multiple dengan instancing Single secara default. 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 komputer klien.

Untuk menyiapkan, membangun, dan menjalankan sampel

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

  2. Jika Anda menggunakan Svcutil.exe untuk menghasilkan klien proksi, pastikan Anda menyertakan opsi /async.

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

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