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.
Pola Asinkron berbasis Peristiwa menyediakan pola untuk mengekspos perilaku asinkron kelas. Dengan pengenalan pola ini, .NET mendefinisikan dua pola untuk mengekspos perilaku asinkron: Pola Asinkron berdasarkan System.IAsyncResult antarmuka, dan pola berbasis peristiwa. Artikel ini menjelaskan kapan tepat bagi Anda untuk mengimplementasikan kedua pola.
Untuk informasi selengkapnya tentang pemrograman asinkron dengan IAsyncResult antarmuka, lihat Model Pemrograman Asinkron (APM).
Prinsip Umum
Secara umum, Anda harus mengekspos fitur asinkron menggunakan Pola Asinkron berbasis Peristiwa jika memungkinkan. Namun, ada beberapa persyaratan yang tidak dapat dipenuhi oleh pola berbasis peristiwa. Dalam kasus tersebut, Anda mungkin perlu menerapkan IAsyncResult pola sebagai tambahan terhadap pola berbasis peristiwa.
Nota
Pola IAsyncResult jarang diimplementasikan tanpa juga mengimplementasikan pola berbasis peristiwa.
Panduan
Daftar berikut ini menjelaskan panduan kapan Anda harus menerapkan Pola Asinkron berbasis Peristiwa:
Gunakan pola berbasis peristiwa sebagai API default untuk mengekspos perilaku asinkron untuk kelas Anda.
Jangan mengekspos IAsyncResult pola saat kelas Anda terutama digunakan dalam aplikasi klien, misalnya Windows Forms.
Hanya memperlihatkan pola IAsyncResult ketika benar-benar diperlukan untuk memenuhi kebutuhan Anda. Misalnya, kompatibilitas dengan API yang sudah ada mungkin mengharuskan Anda untuk mengekspos pola IAsyncResult.
Jangan mengekspos pola IAsyncResult tanpa juga mengekspos pola yang berbasis peristiwa.
Jika Anda harus mengekspos IAsyncResult pola, lakukan sebagai opsi lanjutan. Misalnya, jika Anda membuat objek proksi, buat pola berbasis peristiwa secara default, dengan opsi untuk menghasilkan IAsyncResult pola.
Bangun implementasi pola berbasis peristiwa Anda pada implementasi pola Anda IAsyncResult .
Hindari mengekspos pola berbasis peristiwa dan IAsyncResult pola pada kelas yang sama. Mengekspos pola berbasis peristiwa pada kelas tingkat tinggi dan pola IAsyncResult pada kelas tingkat rendah. Misalnya, bandingkan pola berbasis peristiwa pada komponen WebClient dengan pola IAsyncResult pada kelas HttpRequest.
Mengekspos pola berbasis peristiwa dan IAsyncResult pola pada kelas yang sama saat kompatibilitas memerlukannya. Misalnya, jika Anda telah merilis API yang menggunakan pola IAsyncResult, Anda harus mempertahankan pola IAsyncResult API untuk kompatibilitas mundur.
Mengekspos pola berbasis peristiwa dan IAsyncResult pola pada kelas yang sama jika kompleksitas model objek yang dihasilkan melebihi manfaat memisahkan implementasi. Lebih baik mengekspos kedua pola pada satu kelas daripada menghindari mengekspos pola berbasis peristiwa.
Jika Anda harus mengekspos baik pola berbasis peristiwa maupun pola IAsyncResult pada satu kelas, gunakan EditorBrowsableAttribute yang diatur ke Advanced untuk menandai implementasi pola IAsyncResult sebagai fitur tingkat lanjut. Ini menunjukkan agar lingkungan desain, seperti Visual Studio IntelliSense, tidak menampilkan properti dan metode IAsyncResult. Properti dan metode ini masih dapat digunakan sepenuhnya, tetapi pengembang yang bekerja melalui IntelliSense memiliki tampilan API yang lebih jelas.
Kriteria untuk Mengekspos Pola IAsyncResult selain Pola Berbasis Peristiwa
Meskipun Pola Asinkron berbasis Peristiwa memiliki banyak manfaat di bawah skenario yang disebutkan sebelumnya, pola tersebut memang memiliki beberapa kelemahan, yang harus Anda ketahui apakah performa adalah persyaratan Anda yang paling penting.
Ada tiga skenario yang tidak diatasi pola berbasis peristiwa sebaik pola IAsyncResult.
Pemblokiran menunggu pada satu IAsyncResult
Memblokir tunggu pada banyak IAsyncResult objek
Polling untuk selesai pada IAsyncResult
Anda dapat mengatasi skenario ini dengan menggunakan pola berbasis peristiwa, tetapi melakukannya lebih rumit daripada menggunakan IAsyncResult pola.
Pengembang sering menggunakan IAsyncResult pola untuk layanan yang biasanya memiliki persyaratan performa yang sangat tinggi. Misalnya, polling untuk skenario penyelesaian adalah teknik server berkinerja tinggi.
Selain itu, pola berbasis peristiwa kurang efisien daripada pola IAsyncResult karena menciptakan lebih banyak objek, terutama EventArgs, dan karena melakukan sinkronisasi di seluruh utas.
Daftar berikut ini memperlihatkan beberapa rekomendasi yang harus diikuti jika Anda memutuskan untuk menggunakan IAsyncResult pola:
Hanya ungkapkan pola IAsyncResult ketika Anda benar-benar memerlukan dukungan untuk objek WaitHandle atau IAsyncResult.
Hanya mengekspos IAsyncResult pola ketika Anda memiliki API yang ada yang menggunakan IAsyncResult pola .
Jika Anda memiliki API yang sudah ada berdasarkan IAsyncResult pola, pertimbangkan juga untuk mengekspos pola berbasis peristiwa di rilis berikutnya.
Hanya mengekspos IAsyncResult pola jika Anda memiliki persyaratan performa tinggi yang telah Anda verifikasi tidak dapat dipenuhi oleh pola berbasis peristiwa tetapi dapat dipenuhi oleh IAsyncResult pola.