Bagikan melalui


Membuat dan Memproses Panggilan Asinkron

Objek COM dapat mendukung panggilan asinkron. Ketika klien melakukan panggilan asinkron, kontrol akan segera kembali ke klien. Saat server memproses panggilan, klien bebas melakukan pekerjaan lain. Ketika klien tidak dapat lagi melanjutkan tanpa hasil panggilan, klien bisa mendapatkan hasil panggilan pada saat itu.

Misalnya, permintaan untuk kumpulan rekaman besar atau kompleks dapat memakan waktu. Klien dapat meminta kumpulan rekaman dengan panggilan asinkron lalu melakukan pekerjaan lain. Ketika recordset tersedia, klien dapat memperolehnya dengan cepat tanpa memblokir.

Klien tidak melakukan panggilan asinkron langsung pada objek server. Sebaliknya, mereka mendapatkan objek panggilan yang mengimplementasikan versi asinkron dari antarmuka sinkron pada objek server. Antarmuka asinkron pada objek panggilan memiliki nama formulir AsyncInterfaceName. Misalnya, jika objek server mengimplementasikan antarmuka sinkron bernama IMyInterface, akan ada objek panggilan yang mengimplementasikan antarmuka asinkron bernama AsyncIMyInterface.

Catatan

Dukungan asinkron tidak tersedia untuk IDispatch atau untuk antarmuka yang mewarisi IDispatch.

 

Objek server yang mendukung panggilan asinkron mengimplementasikan antarmuka ICallFactory . Antarmuka ini mengekspos metode tunggal, CreateCall, yang membuat instans objek panggilan tertentu. Klien dapat meminta ICallFactory untuk menentukan apakah objek mendukung panggilan asinkron.

Untuk setiap metode pada antarmuka sinkron, antarmuka asinkron yang sesuai mengimplementasikan dua metode. Metode ini melampirkan awalan Begin_ dan Finish_ ke nama metode sinkron. Misalnya, jika antarmuka bernama ISimpleStream memiliki metode Baca, antarmuka AsyncISimpleStream akan memiliki Begin_Read dan metode Finish_Read. Untuk memulai panggilan asinkron, klien memanggil metode Begin_.

Saat Anda menerapkan objek server, Anda tidak perlu menyediakan objek panggilan untuk setiap antarmuka yang diterapkan objek. Jika objek server mengimplementasikan antarmuka ICallFactory dan menggunakan marshaling standar, klien marshal selalu dapat memperoleh objek panggilan proksi, bahkan jika tidak ada objek panggilan di sisi server. Proksi ini akan melakukan marsekal metode Begin_ sebagai panggilan sinkron, server akan memproses panggilan secara sinkron, dan klien dapat memperoleh parameter keluar dengan memanggil metode Finish_.

Sebaliknya, jika klien melakukan panggilan sinkron marshal pada antarmuka yang ada objek panggilan di sisi server, server akan selalu memproses panggilan secara asinkron. Perilaku ini tidak akan terlihat oleh klien, karena klien akan menerima parameter keluar yang sama dan nilai pengembalian yang sama yang akan diterimanya dari metode sinkron.

Dalam kedua kasus, interaksi antara klien dan server di-marshal seolah-olah panggilan sinkron: Output proksi sinkron dan asinkron tidak dapat dibedakan, seperti output dari stub yang sesuai. Perilaku ini sangat menyederhanakan model pemrograman baik klien maupun server. Jika objek server mengimplementasikan ICallFactory, klien marshal tidak perlu mencoba membuat objek panggilan yang mungkin tidak tersedia — untuk klien, objek panggilan selalu tersedia.

Ketika klien dan server berada di apartemen yang sama, objek server akan memproses panggilan mana pun yang dilakukan klien. Jika objek panggilan tidak tersedia, klien harus secara eksplisit mendapatkan antarmuka sinkron dan melakukan panggilan sinkron.

Untuk mengetahui informasi selengkapnya, lihat topik berikut: