Melakukan Panggilan Asinkron
Prosedur untuk melakukan panggilan sinkron sangat mudah: Klien mendapatkan penunjuk antarmuka pada objek server dan memanggil metode melalui pointer tersebut. Panggilan asinkron melibatkan objek panggilan, sehingga melibatkan beberapa langkah lagi.
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_.
Untuk memulai panggilan asinkron
Kueri objek server untuk antarmuka ICallFactory. Jika QueryInterface mengembalikan E_NOINTERFACE, objek server tidak mendukung panggilan asinkron.
Panggil ICallFactory::CreateCall untuk membuat objek panggilan yang sesuai dengan antarmuka yang Anda inginkan, lalu lepaskan pointer ke ICallFactory.
Jika Anda tidak meminta penunjuk ke antarmuka asinkron dari panggilan ke CreateCall, kueri objek panggilan untuk antarmuka asinkron.
Panggil metode Begin_ yang sesuai.
Objek server sekarang memproses panggilan asinkron, dan klien bebas melakukan pekerjaan lain sampai membutuhkan hasil panggilan.
Objek panggilan hanya dapat memproses satu panggilan asinkron pada satu waktu. Jika klien yang sama atau kedua memanggil metode Begin_ sebelum panggilan asinkron yang tertunda selesai, metode Begin_ akan mengembalikan RPC_E_CALL_PENDING.
Jika klien tidak memerlukan hasil metode Begin_, klien dapat merilis objek panggilan di akhir prosedur ini. COM mendeteksi kondisi ini dan membersihkan panggilan. Metode Finish_ tidak dipanggil, dan klien tidak mendapatkan parameter atau nilai pengembalian apa pun.
Ketika objek server siap untuk kembali dari metode Begin_, itu memberi sinyal objek panggilan bahwa itu dilakukan. Ketika klien siap, klien memeriksa untuk melihat apakah objek panggilan telah diberi sinyal. Jika demikian, klien dapat menyelesaikan panggilan asinkron.
Mekanisme untuk sinyal dan pemeriksaan antara klien dan server ini adalah antarmuka ISynchronize pada objek panggilan. Objek panggilan biasanya mengimplementasikan antarmuka ini dengan menggabungkan objek sinkronisasi yang disediakan sistem. Objek sinkronisasi membungkus handel peristiwa, yang disinyalir server tepat sebelum kembali dari metode Begin_ dengan memanggil ISynchronize::Signal.
Untuk menyelesaikan panggilan asinkron
Kueri objek panggilan untuk antarmuka ISynchronize.
Panggil ISynchronize::Wait.
Jika Tunggu mengembalikan RPC_E_TIMEOUT, metode Begin_ belum selesai diproses. Klien dapat melanjutkan pekerjaan lain dan memanggil Tunggu lagi nanti. Ini tidak dapat memanggil metode Finish_ sampai Tunggu kembali S_OK.
Jika Tunggu mengembalikan S_OK, metode Begin_ telah kembali. Panggil metode Finish_ yang sesuai.
Metode Finish_ meneruskan parameter apa pun kepada klien. Perilaku metode asinkron, termasuk nilai pengembalian metode Finish_, harus sama persis dengan metode sinkron yang sesuai.
Klien dapat merilis objek panggilan segera setelah metode Finish_ kembali, atau dapat menahan pointer ke objek panggilan untuk melakukan panggilan tambahan. Dalam kedua kasus, klien bertanggung jawab untuk merilis objek panggilan ketika objek tidak lagi diperlukan.
Jika Anda memanggil metode Finish_ ketika tidak ada panggilan yang sedang berlangsung, metode akan mengembalikan RPC_E_CALL_COMPLETE.
Catatan
Jika objek klien dan server berada di apartemen yang sama, panggilan ke ICallFactory::CreateCall tidak dijamin berhasil. Jika objek server tidak mendukung panggilan asinkron pada antarmuka tertentu, upaya untuk membuat objek panggilan akan gagal dan klien harus menggunakan antarmuka sinkron.
Topik terkait