Bagikan melalui


Operasi Sinkron dan Asinkron

Topik ini membahas penerapan dan pemanggilan operasi layanan asinkron.

Banyak aplikasi memanggil metode secara asinkron karena memungkinkan aplikasi terus melakukan pekerjaan yang berguna saat panggilan metode berjalan. Windows Communication Foundation (WCF) dan klien dapat berpartisipasi dalam panggilan operasi asinkron pada dua tingkat aplikasi yang berbeda, yang memberikan aplikasi WCF lebih banyak fleksibilitas untuk memaksimalkan throughput yang seimbang terhadap interaktivitas.

Jenis Operasi Asinkron

Semua kontrak layanan di WCF, apa pun jenis parameter dan nilai yang dikembalikan, gunakan atribut WCF untuk menentukan pola pertukaran pesan tertentu antara klien dan layanan. WCF secara otomatis merutekan pesan masuk dan keluar ke operasi layanan yang sesuai atau menjalankan kode klien.

Klien hanya memiliki kontrak layanan, yang menentukan pola pertukaran pesan untuk operasi tertentu. Klien dapat menawarkan model pemrograman apa pun yang mereka pilih kepada pengembang, selama pola pertukaran pesan yang mendasar diamati. Jadi, juga, dapat layanan menerapkan operasi dengan cara apa pun, selama pola pesan yang ditentukan diamati.

Independensi kontrak layanan dari layanan atau implementasi klien memungkinkan bentuk eksekusi asinkron berikut dalam aplikasi WCF:

  • Klien dapat memanggil operasi permintaan/respons secara asinkron menggunakan pertukaran pesan sinkron.

  • Layanan dapat menerapkan operasi permintaan/respons secara asinkron menggunakan pertukaran pesan sinkron.

  • Pertukaran pesan bisa satu arah, terlepas dari implementasi klien atau layanan.

Skenario Asinkron yang Disarankan

Gunakan pendekatan asinkron dalam implementasi operasi layanan jika implementasi layanan operasi melakukan panggilan pemblokiran, seperti melakukan pekerjaan I/O. Saat Anda berada dalam implementasi operasi asinkron, coba panggil operasi dan metode asinkron untuk memperluas jalur panggilan asinkron sejauh mungkin. Misalnya, panggil BeginOperationTwo() dari dalam BeginOperationOne().

  • Gunakan pendekatan asinkron dalam klien atau aplikasi panggilan dalam kasus berikut:

  • Jika Anda memanggil operasi dari aplikasi tingkat menengah. (Untuk mengetahui informasi selengkapnya tentang skenario tersebut, lihat Aplikasi Klien Tingkat Menengah.)

  • Jika Anda memanggil operasi dalam halaman ASP.NET, gunakan halaman asinkron.

  • Jika Anda memanggil operasi dari aplikasi apa pun dengan rangkaian tunggal, seperti Formulir Windows atau Windows Presentation Foundation (WPF). Saat menggunakan model panggilan asinkron berbasis peristiwa, peristiwa hasil dinaikkan pada rangkaian UI, menambahkan responsivitas ke aplikasi tanpa mengharuskan Anda menangani beberapa rangkaian sendiri.

  • Secara umum, jika Anda memiliki pilihan antara panggilan sinkron dan asinkron, pilih panggilan asinkron.

Menerapkan Operasi Layanan Asinkron

Operasi asinkron dapat diimplementasikan dengan menggunakan salah satu dari tiga metode berikut:

  1. Pola asinkron berbasis tugas

  2. Pola asinkron berbasis peristiwa

  3. Pola asinkron IAsyncResult

Pola Asinkron Berbasis Tugas

Pola asinkron berbasis tugas adalah cara yang lebih disukai untuk mengimplementasikan operasi asinkron karena ini adalah yang paling mudah dan paling lurus ke depan. Untuk menggunakan metode ini, cukup terapkan operasi layanan Anda dan tentukan jenis pengembalian Tugas<T>, yang mana T adalah jenis yang dikembalikan oleh operasi logis. Contohnya:

public class SampleService:ISampleService
{
   // ...
   public async Task<string> SampleMethodTaskAsync(string msg)
   {
      return Task<string>.Factory.StartNew(() =>
      {
         return msg;
      });
   }
   // ...
}

Operasi SampleMethodTaskAsync mengembalikan string< Tugas>karena operasi logis mengembalikan string. Untuk informasi selengkapnya tentang pola asinkron berbasis tugas, lihat Pola Asinkron Berbasis Tugas.

Peringatan

Saat menggunakan pola asinkron berbasis tugas, T:System.AggregateException dapat dibuat jika pengecualian terjadi saat menunggu penyelesaian operasi. Pengecualian ini dapat terjadi pada klien atau layanan

Pola Asinkron Berbasis Peristiwa

Kelas yang mendukung Pola Asinkron berbasis Peristiwa akan memiliki satu atau beberapa metode bernama MethodNameAsync. Metode ini dapat mencerminkan versi sinkron, yang mana melakukan operasi yang sama pada rangkaian saat ini. Kelas mungkin juga memiliki peristiwa MethodNameCompleted dan mungkin memiliki metode MethodNameAsyncCancel (atau hanya CancelAsync). Klien yang ingin memanggil operasi akan menentukan penanganan aktivitas yang akan dipanggil saat operasi selesai,

Cuplikan kode berikut menggambarkan cara mendeklarasikan operasi asinkron menggunakan pola asinkron berbasis peristiwa.

public class AsyncExample
{
    // Synchronous methods.
    public int Method1(string param);
    public void Method2(double param);

    // Asynchronous methods.
    public void Method1Async(string param);
    public void Method1Async(string param, object userState);
    public event Method1CompletedEventHandler Method1Completed;

    public void Method2Async(double param);
    public void Method2Async(double param, object userState);
    public event Method2CompletedEventHandler Method2Completed;

    public void CancelAsync(object userState);

    public bool IsBusy { get; }

    // Class implementation not shown.
}

Untuk informasi selengkapnya tentang Pola Asinkron Berbasis Per, lihat Pola Asinkron Berbasis Peristiwa.

Polas Asinkron IAsyncResult

Operasi layanan dapat diimplementasikan dengan cara asinkron menggunakan pola pemrograman .NET Framework asinkron dan menandai metode <Begin> dengan properti AsyncPattern yang diatur ke true. Dalam hal ini, operasi asinkron diekspos dalam metadata dalam bentuk yang sama dengan operasi sinkron: Operasi ini diekspos sebagai operasi tunggal dengan pesan permintaan dan pesan respons yang berkorelasi. Kemudian model pemrograman klien memiliki pilihan. Model ini dapat mewakili pola ini sebagai operasi sinkron atau sebagai yang asinkron, selama layanan dipanggil pertukaran pesan respons permintaan berlangsung.

Secara umum, dengan sifat asinkron sistem, Anda tidak boleh mengambil dependensi pada rangkaian. Cara yang paling dapat diandalkan untuk meneruskan data ke berbagai tahap pemrosesan pengiriman operasi adalah dengan menggunakan ekstensi.

Misalnya, lihat Cara: Menerapkan Operasi Layanan Asinkron.

Untuk menentukan X operasi kontrak yang dijalankan secara asinkron terlepas dari caranya dipanggil dalam aplikasi klien:

  • Tentukan dua metode menggunakan pola BeginOperation dan EndOperation.

  • Metode BeginOperation mencakup parameter in dan ref untuk operasi dan mengembalikan jenis IAsyncResult.

  • Metode EndOperation mencakup parameter IAsyncResult serta parameter out dan ref serta mengembalikan jenis pengembalian operasi.

Misalnya, lihat metode berikut.

int DoWork(string data, ref string inout, out string outonly)
Function DoWork(ByVal data As String, ByRef inout As String, _out outonly As out) As Integer

Untuk membuat operasi asinkron, kedua metode tersebut adalah:

[OperationContract(AsyncPattern=true)]
IAsyncResult BeginDoWork(string data,
                         ref string inout,
                         AsyncCallback callback,
                         object state);
int EndDoWork(ref string inout, out string outonly, IAsyncResult result);
<OperationContract(AsyncPattern := True)>
Function BeginDoWork(ByVal data As String, _
                     ByRef inout As String, _
                     ByVal callback As AsyncCallback, _
                     ByVal state As Object) As IAsyncResult
Function EndDoWork(ByRef inout As String, ByRef outonly As String, ByVal result As IAsyncResult) As Integer

Catatan

Atribut OperationContractAttribute hanya diterapkan ke metode BeginDoWork. Kontrak yang dihasilkan memiliki satu operasi WSDL bernama DoWork.

Pemanggilan Asinkron Sisi Klien

Aplikasi klien WCF dapat menggunakan salah satu dari tiga model panggilan asinkron yang dijelaskan sebelumnya

Saat menggunakan model berbasis tugas, cukup panggil operasi menggunakan kata kunci tunggu seperti yang ditunjukkan dalam cuplikan kode berikut.

await simpleServiceClient.SampleMethodTaskAsync("hello, world");

Menggunakan pola asinkron berbasis peristiwa hanya mengharuskan penambahan penanganan aktivitas untuk menerima pemberitahuan respons -- dan peristiwa yang dihasilkan dinaikkan pada rangkaian antarmuka pengguna secara otomatis. Untuk menggunakan pendekatan ini, tentukan opsi perintah /async dan /tcv:Version35 dengan Alat Utilitas Metadata ServiceModel (Svcutil.exe), seperti dalam contoh berikut.

svcutil http://localhost:8000/servicemodelsamples/service/mex /async /tcv:Version35

Setelah ini selesai, Svcutil.exe menghasilkan kelas klien WCF dengan infrastruktur peristiwa yang memungkinkan aplikasi panggilan mengimplementasikan dan menetapkan penanganan aktivitas untuk menerima respons dan mengambil tindakan yang sesuai. Untuk contoh lengkapnya, lihat Cara: Memanggil Operasi Layanan Secara Asinkron.

Namun, model asinkron berbasis peristiwa hanya tersedia di .NET Framework 3.5. Selain itu, ini tidak didukung bahkan di .NET Framework 3.5 jika saluran klien WCF dibuat dengan menggunakan System.ServiceModel.ChannelFactory<TChannel>. Dengan objek saluran klien WCF, Anda harus menggunakan objek System.IAsyncResult untuk memanggil operasi Anda secara asinkron. Untuk menggunakan pendekatan ini, tentukan opsi perintah /async dengan Alat Utilitas Metadata ServiceModel (Svcutil.exe), seperti dalam contoh berikut.

svcutil http://localhost:8000/servicemodelsamples/service/mex /async

Ini menghasilkan kontrak layanan saat setiap operasi dimodelkan sebagai metode <Begin> dengan properti AsyncPattern yang diatur ke true dan metode yang sesuai <End>. Untuk contoh lengkap menggunakan ChannelFactory<TChannel>, lihat Cara: Memanggil Operasi Secara Asinkron Menggunakan Channel Factory.

Dalam kedua kasus, aplikasi dapat memanggil operasi secara asinkron meskipun layanan diimplementasikan secara sinkron, dengan cara yang sama seperti aplikasi dapat menggunakan pola yang sama untuk memanggil metode sinkron lokal secara asinkron. Bagaimana operasi diimplementasikan tidak signifikan bagi klien; jika pesan respons tiba, kontennya dikirim ke metode <End> asinkron klien dan klien mengambil informasi.

Pola Pertukaran Pesan Satu Arah

Anda juga dapat membuat pola pertukaran pesan asinkron yaitu operasi satu arah (operasi yang OperationContractAttribute.IsOneWay-nya adalah true tidak memiliki respons berkorelasi) dapat dikirim ke arah mana pun oleh klien atau layanan secara independen dari sisi lain. (Ini menggunakan pola pertukaran pesan dupleks dengan pesan satu arah.) Dalam hal ini, kontrak layanan menentukan pertukaran pesan satu arah yang dapat diterapkan oleh salah satu sisi sebagai panggilan atau implementasi asinkron, atau tidak, sebagaimana mewajibkan. Umumnya, saat kontrak adalah pertukaran pesan satu arah, implementasi sebagian besar dapat menjadi asinkron, karena setelah pesan dikirim, aplikasi tidak menunggu balasan dan dapat terus melakukan pekerjaan lain.

Klien Asinkron Berbasis Peristiwa dan Kontrak Pesan

Panduan desain untuk status model asinkron berbasis peristiwa bahwa jika lebih dari satu nilai dikembalikan, satu nilai dikembalikan sebagai properti Result dan yang lain dikembalikan sebagai properti pada objek EventArgs. Salah satu hasilnya adalah bahwa jika klien mengimpor metadata menggunakan opsi perintah asinkron berbasis peristiwa dan operasi mengembalikan lebih dari satu nilai, objek EventArgs default mengembalikan satu nilai sebagai properti Result dan sisanya adalah properti objek EventArgs.

Jika Anda ingin menerima objek pesan sebagai properti Result dan memiliki nilai yang dikembalikan sebagai properti pada objek tersebut, gunakan opsi perintah /messageContract. Ini menghasilkan tanda tangan yang mengembalikan pesan respons sebagai properti Result pada objek EventArgs. Semua nilai pengembalian internal kemudian merupakan properti dari objek pesan respons.

Lihat juga